home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #3 / Amiga Plus CD - 2002 - No. 03.iso / AmigaPlus / Tools / Development / envCPP31 / c++ / tools / cprefs / source / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-01-01  |  198.6 KB  |  3,695 lines

  1. /* -----------------------------------------------------------------------------
  2.  
  3.   cprefs - preferences for compilers
  4.  
  5.   SAS/C:
  6.  
  7.   make all
  8.  
  9.   ------------------------------------------------------------------------------
  10. */
  11.  
  12.  
  13. #include "defs.h"
  14.  
  15. /// "prototypes"
  16.  
  17. Prototype void                      CloseUserInterface  (void);
  18. Prototype void                      CloseWindowSafely   (struct WindowSupportInfo *);
  19. Prototype struct Node              *CreateNode          (UBYTE *);
  20. Prototype void                      DefaultGadgetHandler(struct WindowSupportInfo *, UWORD);
  21. Prototype void                      DetachGadgets       (struct WindowSupportInfo *, BOOL);
  22. Prototype void                      DiscardInputEvents  (struct Window *);
  23. Prototype BOOL                      ExamineListview     (struct WindowSupportInfo *, struct Gadget *, struct List **, struct Node **, ULONG *, ULONG *, UWORD *);
  24. Prototype void                      FreeDupes           (struct List *, UBYTE *);
  25. Prototype void                      FreeNode            (struct Node *);
  26. Prototype void                      FreeNodes           (struct List *);
  27. Prototype void                      FreeOptions         (struct Options *);
  28. Prototype void                      FreeValue           (struct Value *);
  29. Prototype struct List              *GetValueList        (struct Value *);
  30. Prototype UWORD                     GetValueNumber      (struct Value *);
  31. Prototype UBYTE                    *GetValueString      (struct Value *);
  32. Prototype void                      InitOptions         (struct Options *);
  33. Prototype void                      InitSyntax          (void);
  34. Prototype void                      LayoutDialog        (struct WindowSupportInfo *, UWORD, UWORD);
  35. Prototype BOOL                      LoadOptions         (struct Options *, UBYTE *, UWORD, BOOL);
  36. Prototype int                       main                (int, char **);
  37. Prototype BOOL                      NameNode            (struct Node *, UBYTE *);
  38. Prototype struct WindowSupportInfo *OpenDialog          (UWORD, UWORD, UWORD, UWORD, UBYTE *, ULONG);
  39. Prototype void                      ReadPage            (struct WindowSupportInfo *);
  40. Prototype void                      RefreshGhosting     (struct WindowSupportInfo *);
  41. Prototype void                      RefreshPage         (struct WindowSupportInfo *);
  42. Prototype void                      RemoveGadgetList    (struct Window *, struct Gadget *, UWORD);
  43. Prototype UBYTE                    *RequestPath         (UBYTE *, UBYTE *, UBYTE *, BOOL, BOOL);
  44. Prototype void                      ResetOptions        (struct Options *, UWORD);
  45. Prototype BOOL                      SaveOptions         (struct Options *, UBYTE *);
  46. Prototype UWORD                     ScaleX              (struct WindowSupportInfo *, UWORD);
  47. Prototype UWORD                     ScaleY              (struct WindowSupportInfo *, UWORD);
  48. Prototype void                      SetOption           (struct Options *, UWORD, APTR);
  49. Prototype UWORD                     SetValueNumber      (struct Value *, UWORD);
  50. Prototype UBYTE                    *SetValueString      (struct Value *, UBYTE *);
  51. Prototype BOOL                      ShowPage            (struct WindowSupportInfo *, UWORD);
  52. Prototype struct WindowSupportInfo *ShowUserInterface   (void);
  53. Prototype UBYTE                    *Tackon              (UBYTE *, UBYTE *);
  54. Prototype void                      Warn                (UBYTE *, APTR);
  55. Prototype void                      WindowLoop          (struct WindowSupportInfo *);
  56.  
  57. ///
  58. /// "globals"
  59.  
  60. // global configuration
  61.  
  62. struct Config Config;
  63.  
  64. // global strings
  65.  
  66. #ifdef __SASC
  67.  
  68. UBYTE Version[] = "$VER: " PROGRAMNAME " 1.0 " __AMIGADATE__ "\n\0";
  69.  
  70. #else
  71.  
  72. UBYTE Version[] = "$VER: " PROGRAMNAME " 1.0 (" __COMMODORE_DATE__ ")\n\0";
  73.  
  74. #endif
  75.  
  76. UBYTE Assert[] = "ERROR IN LINE %d !";
  77.  
  78. /* ------------------------------------- Menu ----------------------------------
  79.  
  80.  Menu
  81.  
  82. */
  83.  
  84. struct NewMenu NewMenu[] =
  85. {
  86.     NM_TITLE, "Compiler Options",   NULL, 0, 0, NULL,
  87.     NM_ITEM , "Reset all options",  "R" , 0, 0, NULL,
  88.     NM_ITEM , "Reset this page",    "C" , 0, 0, NULL,
  89.     NM_ITEM , "About..."         ,  "?" , 0, 0, NULL,
  90.  
  91.     NM_END, NULL, NULL, 0, 0L, NULL
  92. };
  93.  
  94. ///
  95. /// "globals (gcc)"
  96.  
  97. /* ------------------------------- Connectivity --------------------------------
  98.  
  99.  The connectivity table describes how gadgets interact (e.g. an "add" gadget
  100.  adding entries to another gadget).
  101.  
  102. */
  103.  
  104. #ifdef TARGET_GCC
  105.  
  106. struct Connectivity Connectivity[] =
  107. {
  108.       // DIALOG PAGE       GADGET (SOURCE)        GADGET (TARGET)       ACTION
  109.  
  110.     { PAGE_COMPILER,       GD_GLOBALINCLUDES,    GD_GLOBALINCLUDES,     ACTION_REFRESH   },
  111.     { PAGE_COMPILER,       GD_ADDGLOBALINCLUDE,  GD_GLOBALINCLUDES,     ACTION_REQFOLDER },
  112.     { PAGE_COMPILER,       GD_DELGLOBALINCLUDE,  GD_GLOBALINCLUDES,     ACTION_DEL       },
  113.     { PAGE_COMPILER,       GD_EDITGLOBALINCLUDE, GD_GLOBALINCLUDES,     ACTION_EDIT      },
  114.  
  115.     { PAGE_COMPILER,       GD_LOCALINCLUDES,     GD_LOCALINCLUDES,      ACTION_REFRESH   },
  116.     { PAGE_COMPILER,       GD_ADDLOCALINCLUDE,   GD_LOCALINCLUDES,      ACTION_REQFOLDER },
  117.     { PAGE_COMPILER,       GD_DELLOCALINCLUDE,   GD_LOCALINCLUDES,      ACTION_DEL       },
  118.     { PAGE_COMPILER,       GD_EDITLOCALINCLUDE,  GD_LOCALINCLUDES,      ACTION_EDIT      },
  119.  
  120.     { PAGE_COMPILER,       GD_GETSPECSFILE,      GD_SPECSFILE,          ACTION_REQFILE   },
  121.  
  122.     { PAGE_PREPROCESSOR,   GD_DEFINES,           GD_DEFINES,            ACTION_REFRESH   },
  123.     { PAGE_PREPROCESSOR,   GD_ADDDEFINE,         GD_DEFINES,            ACTION_ADD       },
  124.     { PAGE_PREPROCESSOR,   GD_DELDEFINE,         GD_DEFINES,            ACTION_DEL       },
  125.     { PAGE_PREPROCESSOR,   GD_EDITDEFINE,        GD_DEFINES,            ACTION_EDIT      },
  126.  
  127.     { PAGE_PREPROCESSOR,   GD_UNDEFINES,         GD_UNDEFINES,          ACTION_REFRESH   },
  128.     { PAGE_PREPROCESSOR,   GD_ADDUNDEFINE,       GD_UNDEFINES,          ACTION_ADD       },
  129.     { PAGE_PREPROCESSOR,   GD_DELUNDEFINE,       GD_UNDEFINES,          ACTION_DEL       },
  130.     { PAGE_PREPROCESSOR,   GD_EDITUNDEFINE,      GD_UNDEFINES,          ACTION_EDIT      },
  131.  
  132.     { PAGE_MESSAGES,       GD_ENABLED,           GD_ENABLED,            ACTION_REFRESH   },
  133.     { PAGE_MESSAGES,       GD_ADDENABLED,        GD_ENABLED,            ACTION_POP       },
  134.     { PAGE_MESSAGES,       GD_DELENABLED,        GD_ENABLED,            ACTION_DEL       },
  135.     { PAGE_MESSAGES,       GD_EDITENABLED,       GD_ENABLED,            ACTION_EDIT      },
  136.  
  137.     { PAGE_MESSAGES,       GD_DISABLED,          GD_DISABLED,           ACTION_REFRESH   },
  138.     { PAGE_MESSAGES,       GD_ADDDISABLED,       GD_DISABLED,           ACTION_POP       },
  139.     { PAGE_MESSAGES,       GD_DELDISABLED,       GD_DISABLED,           ACTION_DEL       },
  140.     { PAGE_MESSAGES,       GD_EDITDISABLED,      GD_DISABLED,           ACTION_EDIT      },
  141.  
  142.     { PAGE_LINKER,         GD_OBJECTS,           GD_OBJECTS,            ACTION_REFRESH   },
  143.     { PAGE_LINKER,         GD_ADDOBJECT,         GD_OBJECTS,            ACTION_REQFILE   },
  144.     { PAGE_LINKER,         GD_DELOBJECT,         GD_OBJECTS,            ACTION_DEL       },
  145.     { PAGE_LINKER,         GD_EDITOBJECT,        GD_OBJECTS,            ACTION_EDIT      },
  146.  
  147.     { PAGE_LINKER,         GD_LIBPATHS,          GD_LIBPATHS,           ACTION_REFRESH   },
  148.     { PAGE_LINKER,         GD_ADDLIBPATH,        GD_LIBPATHS,           ACTION_REQFOLDER },
  149.     { PAGE_LINKER,         GD_DELLIBPATH,        GD_LIBPATHS,           ACTION_DEL       },
  150.     { PAGE_LINKER,         GD_EDITLIBPATH,       GD_LIBPATHS,           ACTION_EDIT      },
  151.  
  152.     { PAGE_SPECIAL,        GD_OPTIONS,           GD_OPTIONS,            ACTION_REFRESH   },
  153.     { PAGE_SPECIAL,        GD_ADDOPTION,         GD_OPTIONS,            ACTION_ADD       },
  154.     { PAGE_SPECIAL,        GD_DELOPTION,         GD_OPTIONS,            ACTION_DEL       },
  155.     { PAGE_SPECIAL,        GD_EDITOPTION,        GD_OPTIONS,            ACTION_EDIT      },
  156.  
  157.     PAGE_MAXIMUM
  158. };
  159.  
  160. /* ------------------------------------ Syntax ---------------------------------
  161.  
  162.  Global syntax table with "rules". This table describes all options, their
  163.  default values, associated gadgets etc. Order in this table is important if
  164.  entries have similar templates. For example, "-dontwarn=-1" is listed before
  165.  "-dontwarn=*" because it is a specal case of "-dontwarn=*" (and as such has
  166.  higher precedence). Options which are displayed on multiple pages have a
  167.  RULE_DONOTSAVE flag set in their secondary entry because the secondary entry
  168.  will only be used to sync with the GUI, not for parsing configuration files.
  169.  
  170. */
  171.  
  172. struct Syntax Syntax[] =
  173. {
  174.     // OPTION IDENTIFIER            OPTION TYPE     DEFAULT VALUE                              DIALOG PAGE        GADGET ID              GADGET TYPE     TEMPLATE (or NULL)              VALUE ASSOCIATED WITH TEMPLATE               FLAGS               ACTIVATOR DEACTIVATOR STATUS
  175.  
  176.     // index page
  177.  
  178.     { OPTION_OPTIMIZE            ,  VALUE_NUMBER  , VAL_OPTIMIZE_DEFAULT                     , PAGE_INDEX       , GD_OPTIMIZE          , CYCLE_KIND    , NULL                          , UNDEFINED                                  , RULE_DONOTSAVE  ,   NULL,     NULL ,      SYNTAX_ACTIVE   },
  179.     { OPTION_LINK                ,  VALUE_NUMBER  , VAL_LINK_LINK                            , PAGE_INDEX       , GD_LINK              , CYCLE_KIND    , NULL                          , UNDEFINED                                  , RULE_DONOTSAVE  ,   NULL,     NULL ,      SYNTAX_ACTIVE   },
  180.     { OPTION_DEBUG               ,  VALUE_NUMBER  , VAL_DEBUG_NODEBUG                        , PAGE_INDEX       , GD_DEBUGINFO         , CYCLE_KIND    , NULL                          , UNDEFINED                                  , RULE_DONOTSAVE  ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  181.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_INDEX       , GD_PROCESSOR         , CYCLE_KIND    , NULL                          , UNDEFINED                                  , RULE_DONOTSAVE  ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  182.     { OPTION_VERBOSE             ,  VALUE_NUMBER  , VAL_VERBOSE_DEFAULT                      , PAGE_INDEX       , GD_VERBOSE           , CYCLE_KIND    , "-v"                          , VAL_VERBOSE_VERBOSE                        , 0               ,   NULL,     NULL ,      SYNTAX_ACTIVE   },
  183.     { OPTION_TARGET              ,  VALUE_STRING  , 0                                        , PAGE_INDEX       , GD_TARGET            , STRING_KIND   , "-b *"                        , 0                                          , 0               ,   NULL,     NULL ,      SYNTAX_ACTIVE   },
  184.  
  185.     // compiler page
  186.  
  187.     { OPTION_LOCALINCLUDES       ,  VALUE_LIST    , 0                                        , PAGE_COMPILER    , GD_LOCALINCLUDES     , LISTVIEW_KIND , "-I*"                         , 0                                          , 0               ,   NULL ,    "-I-",      SYNTAX_ACTIVE   },
  188.     { OPTION_GLOBALINCLUDES      ,  VALUE_LIST    , 0                                        , PAGE_COMPILER    , GD_GLOBALINCLUDES    , LISTVIEW_KIND , "-I*"                         , 0                                          , 0               ,   "-I-",    NULL ,      SYNTAX_INACTIVE },
  189.     { OPTION_COMPILE             ,  VALUE_NUMBER  , VAL_COMPILE_COMPILE                      , PAGE_COMPILER    , GD_COMPILE           , CYCLE_KIND    , "-E"                          , VAL_COMPILE_PREPROCESSONLY                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  190.     { OPTION_ASSEMBLE            ,  VALUE_NUMBER  , VAL_ASSEMBLE_ASSEMBLE                    , PAGE_COMPILER    , GD_ASSEMBLE          , CYCLE_KIND    , "-S"                          , VAL_ASSEMBLE_NOASSEMBLE                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  191.     { OPTION_INTERMEDIATEFILES   ,  VALUE_NUMBER  , VAL_INTERMEDIATEFILES_INTERMEDIATEFILES  , PAGE_COMPILER    , GD_INTERMEDIATEFILES , CYCLE_KIND    , "-pipe"                       , VAL_INTERMEDIATEFILES_USEPIPE              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  192.     { OPTION_SPECSFILE           ,  VALUE_STRING  , 0                                        , PAGE_COMPILER    , GD_SPECSFILE         , STRING_KIND   , "-specs=*"                    , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  193.     { OPTION_DELETEINTERMEDIATE  ,  VALUE_NUMBER  , VAL_DELETEINTERMEDIATE_DELETEINTERMEDIATE, PAGE_COMPILER    , GD_DELETEINTERMEDIATE, CYCLE_KIND    , "-save-temps"                 , VAL_DELETEINTERMEDIATE_SAVEINTERMEDIATE    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  194.     { OPTION_AUTODETECT          ,  VALUE_NUMBER  , VAL_AUTODETECT_DEFAULT                   , PAGE_COMPILER    , GD_AUTODETECT        , CYCLE_KIND    , "-xnone"                      , VAL_AUTODETECT_AUTODETECTTYPE              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  195.     { OPTION_AUTODETECT          ,  VALUE_NUMBER  , VAL_AUTODETECT_DEFAULT                   , PAGE_COMPILER    , GD_AUTODETECT        , CYCLE_KIND    , "-xc"                         , VAL_AUTODETECT_C                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  196.     { OPTION_AUTODETECT          ,  VALUE_NUMBER  , VAL_AUTODETECT_DEFAULT                   , PAGE_COMPILER    , GD_AUTODETECT        , CYCLE_KIND    , "-xobjective-c"               , VAL_AUTODETECT_OBJECTIVEC                  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  197.     { OPTION_AUTODETECT          ,  VALUE_NUMBER  , VAL_AUTODETECT_DEFAULT                   , PAGE_COMPILER    , GD_AUTODETECT        , CYCLE_KIND    , "-xc++"                       , VAL_AUTODETECT_CPLUSPLUS                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  198.     { OPTION_AUTODETECT          ,  VALUE_NUMBER  , VAL_AUTODETECT_DEFAULT                   , PAGE_COMPILER    , GD_AUTODETECT        , CYCLE_KIND    , "-xc-header"                  , VAL_AUTODETECT_HEADER                      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  199.     { OPTION_AUTODETECT          ,  VALUE_NUMBER  , VAL_AUTODETECT_DEFAULT                   , PAGE_COMPILER    , GD_AUTODETECT        , CYCLE_KIND    , "-xcpp-output"                , VAL_AUTODETECT_PREPROCESSEDC               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  200.     { OPTION_AUTODETECT          ,  VALUE_NUMBER  , VAL_AUTODETECT_DEFAULT                   , PAGE_COMPILER    , GD_AUTODETECT        , CYCLE_KIND    , "-xc++-cpp-output"            , VAL_AUTODETECT_PREPROCESSEDCPLUSPLUS       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  201.     { OPTION_AUTODETECT          ,  VALUE_NUMBER  , VAL_AUTODETECT_DEFAULT                   , PAGE_COMPILER    , GD_AUTODETECT        , CYCLE_KIND    , "-xassembler"                 , VAL_AUTODETECT_ASSEMBLER                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  202.     { OPTION_AUTODETECT          ,  VALUE_NUMBER  , VAL_AUTODETECT_DEFAULT                   , PAGE_COMPILER    , GD_AUTODETECT        , CYCLE_KIND    , "-xassembler-with-cpp"        , VAL_AUTODETECT_ASSEMBLERWCPP               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  203.     { OPTION_STDINCLUDES         ,  VALUE_NUMBER  , VAL_STDINCLUDES_INCLUDES                 , PAGE_COMPILER    , GD_STDINCLUDES       , CYCLE_KIND    , "-nostdinc"                   , VAL_STDINCLUDES_NOSTDINCLUDES              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  204.  
  205.     // messages page
  206.  
  207.     { OPTION_WARNINGS            ,  VALUE_NUMBER  , VAL_WARNINGS_WARNINGS                    , PAGE_MESSAGES    , GD_WARNINGS          , CYCLE_KIND    , "-w"                          , VAL_WARNINGS_NOWARNINGS                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  208.     { OPTION_WARNINGS            ,  VALUE_NUMBER  , VAL_WARNINGS_WARNINGS                    , PAGE_MESSAGES    , GD_WARNINGS          , CYCLE_KIND    , "-Wall"                       , VAL_WARNINGS_ALLWARNINGS                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  209.     { OPTION_PEDANTIC            ,  VALUE_NUMBER  , VAL_PEDANTIC_NOPEDANTIC                  , PAGE_MESSAGES    , GD_PEDANTIC          , CYCLE_KIND    , "-pedantic"                   , VAL_PEDANTIC_PEDANTIC                      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  210.     { OPTION_PEDANTIC            ,  VALUE_NUMBER  , VAL_PEDANTIC_NOPEDANTIC                  , PAGE_MESSAGES    , GD_PEDANTIC          , CYCLE_KIND    , "-pedantic-errors"            , VAL_PEDANTIC_PEDANTICERRORS                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  211.     { OPTION_EXTRAWARNINGS       ,  VALUE_NUMBER  , VAL_EXTRAWARNINGS_NOEXTRAWARNINGS        , PAGE_MESSAGES    , GD_EXTRAWARNINGS     , CYCLE_KIND    , "-W"                          , VAL_EXTRAWARNINGS_EXTRAWARNINGS            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  212.     { OPTION_ABORT               ,  VALUE_NUMBER  , VAL_ABORT_NOABORT                        , PAGE_MESSAGES    , GD_ABORT             , CYCLE_KIND    , "-Werror"                     , VAL_ABORT_ABORT                            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  213.     { OPTION_PERMISSIVECPP       ,  VALUE_NUMBER  , VAL_PERMISSIVECPP_DEFAULT                , PAGE_MESSAGES    , GD_PERMISSIVECPP     , CYCLE_KIND    , "-fno-permissive"             , VAL_PERMISSIVECPP_NOPERMISSIVECPLUSPLUS    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  214.     { OPTION_PERMISSIVECPP       ,  VALUE_NUMBER  , VAL_PERMISSIVECPP_DEFAULT                , PAGE_MESSAGES    , GD_PERMISSIVECPP     , CYCLE_KIND    , "-fpermissive"                , VAL_PERMISSIVECPP_PERMISSIVECPLUSPLUS      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  215.     { OPTION_DIAGNOSTICS         ,  VALUE_NUMBER  , VAL_DIAGNOSTICS_OPTIONALDIAGNOSTICS      , PAGE_MESSAGES    , GD_DIAGNOSTICS       , CYCLE_KIND    , "-fno-optional-diags"         , VAL_DIAGNOSTICS_NOOPTDIAGNOSTICS           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  216.     { OPTION_DISABLED            ,  VALUE_LIST    , 0                                        , PAGE_MESSAGES    , GD_DISABLED          , LISTVIEW_KIND , "-Wno-*"                      , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  217.     { OPTION_ENABLED             ,  VALUE_LIST    , 0                                        , PAGE_MESSAGES    , GD_ENABLED           , LISTVIEW_KIND , "-W*"                         , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  218.  
  219.     // language page
  220.  
  221.     { OPTION_ANSI                ,  VALUE_NUMBER  , VAL_ANSI_NOANSICCOMPILER                 , PAGE_LANGUAGE    , GD_ANSI              , CYCLE_KIND    , "-ansi"                       , VAL_ANSI_ANSICCOMPILER                     , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  222.     { OPTION_LANGUAGE            ,  VALUE_NUMBER  , VAL_LANGUAGE_DEFAULT                     , PAGE_LANGUAGE    , GD_LANGUAGE          , CYCLE_KIND    , "-std=gnu89"                  , VAL_LANGUAGE_LANGUAGEGNU89                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  223.     { OPTION_LANGUAGE            ,  VALUE_NUMBER  , VAL_LANGUAGE_DEFAULT                     , PAGE_LANGUAGE    , GD_LANGUAGE          , CYCLE_KIND    , "-std=gnu9x"                  , VAL_LANGUAGE_LANGAUGEGNU9X                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  224.     { OPTION_LANGUAGE            ,  VALUE_NUMBER  , VAL_LANGUAGE_DEFAULT                     , PAGE_LANGUAGE    , GD_LANGUAGE          , CYCLE_KIND    , "-std=c89"                    , VAL_LANGUAGE_LANGUAGEC89                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  225.     { OPTION_LANGUAGE            ,  VALUE_NUMBER  , VAL_LANGUAGE_DEFAULT                     , PAGE_LANGUAGE    , GD_LANGUAGE          , CYCLE_KIND    , "-std=c9x"                    , VAL_LANGUAGE_LANGUAGEC9X                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  226.     { OPTION_LANGUAGE            ,  VALUE_NUMBER  , VAL_LANGUAGE_DEFAULT                     , PAGE_LANGUAGE    , GD_LANGUAGE          , CYCLE_KIND    , "-std=iso9899:1990"           , VAL_LANGUAGE_LANGUAGEISO98991990           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  227.     { OPTION_LANGUAGE            ,  VALUE_NUMBER  , VAL_LANGUAGE_DEFAULT                     , PAGE_LANGUAGE    , GD_LANGUAGE          , CYCLE_KIND    , "-std=iso9899:199409"         , VAL_LANGUAGE_LANGUAGEISO98991994           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  228.     { OPTION_LANGUAGE            ,  VALUE_NUMBER  , VAL_LANGUAGE_DEFAULT                     , PAGE_LANGUAGE    , GD_LANGUAGE          , CYCLE_KIND    , "-std=iso9899:199X"           , VAL_LANGUAGE_LANGUAGEISO9899199X           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  229.     { OPTION_INLINEASM           ,  VALUE_NUMBER  , VAL_INLINEASM_DEFAULT                    , PAGE_LANGUAGE    , GD_INLINEASM         , CYCLE_KIND    , "-fasm"                       , VAL_INLINEASM_INLINEASM                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  230.     { OPTION_INLINEASM           ,  VALUE_NUMBER  , VAL_INLINEASM_DEFAULT                    , PAGE_LANGUAGE    , GD_INLINEASM         , CYCLE_KIND    , "-fno-asm"                    , VAL_INLINEASM_NOINLINEASM                  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  231.     { OPTION_BUILTIN             ,  VALUE_NUMBER  , VAL_BUILTIN_DEFAULT                      , PAGE_LANGUAGE    , GD_BUILTIN           , CYCLE_KIND    , "-fbuiltin"                   , VAL_BUILTIN_BUILTINFUNCTIONS               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  232.     { OPTION_BUILTIN             ,  VALUE_NUMBER  , VAL_BUILTIN_DEFAULT                      , PAGE_LANGUAGE    , GD_BUILTIN           , CYCLE_KIND    , "-fno-builtin"                , VAL_BUILTIN_NOBUILTINFUNCTIONS             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  233.     { OPTION_FREESTANDING        ,  VALUE_NUMBER  , VAL_FREESTANDING_DEFAULT                 , PAGE_LANGUAGE    , GD_FREESTANDING      , CYCLE_KIND    , "-ffreestanding"              , VAL_FREESTANDING_FREESTANDING              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  234.     { OPTION_FREESTANDING        ,  VALUE_NUMBER  , VAL_FREESTANDING_DEFAULT                 , PAGE_LANGUAGE    , GD_FREESTANDING      , CYCLE_KIND    , "-fhosted"                    , VAL_FREESTANDING_HOSTED                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  235.     { OPTION_TRIGRAPHS           ,  VALUE_NUMBER  , VAL_TRIGRAPHS_NOTRIGRAPHS                , PAGE_LANGUAGE    , GD_TRIGRAPHS         , CYCLE_KIND    , "-trigraphs"                  , VAL_TRIGRAPHS_TRIGRAPHS                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  236.     { OPTION_TRADITIONAL         ,  VALUE_NUMBER  , VAL_TRADITIONAL_NOTRADITIONALC           , PAGE_LANGUAGE    , GD_TRADITIONAL       , CYCLE_KIND    , "-traditional"                , VAL_TRADITIONAL_TRADIONALC                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  237.     { OPTION_CHAR                ,  VALUE_NUMBER  , VAL_CHAR_DEFAULT                         , PAGE_LANGUAGE    , GD_CHAR              , CYCLE_KIND    , "-fsigned-char"               , VAL_CHAR_SIGNEDCHAR                        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  238.     { OPTION_CHAR                ,  VALUE_NUMBER  , VAL_CHAR_DEFAULT                         , PAGE_LANGUAGE    , GD_CHAR              , CYCLE_KIND    , "-funsigned-char"             , VAL_CHAR_UNSIGNEDCHAR                      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  239.     { OPTION_BITFIELD            ,  VALUE_NUMBER  , VAL_BITFIELD_DEFAULT                     , PAGE_LANGUAGE    , GD_BITFIELD          , CYCLE_KIND    , "-fsigned-bitfields"          , VAL_BITFIELD_SIGNEDBITFIELD                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  240.     { OPTION_BITFIELD            ,  VALUE_NUMBER  , VAL_BITFIELD_DEFAULT                     , PAGE_LANGUAGE    , GD_BITFIELD          , CYCLE_KIND    , "-funsigned-bitfields"        , VAL_BITFIELD_UNSIGNEDBITFIELD              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  241.     { OPTION_CONSTSTRINGS        ,  VALUE_NUMBER  , VAL_CONSTSTRINGS_DEFAULT                 , PAGE_LANGUAGE    , GD_CONSTSTRINGS      , CYCLE_KIND    , "-fno-writable-strings"       , VAL_CONSTSTRINGS_STRINGSCONST              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  242.     { OPTION_CONSTSTRINGS        ,  VALUE_NUMBER  , VAL_CONSTSTRINGS_DEFAULT                 , PAGE_LANGUAGE    , GD_CONSTSTRINGS      , CYCLE_KIND    , "-fwritable-strings"          , VAL_CONSTSTRINGS_WRITEABLESTRINGS          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  243.     { OPTION_PROMOTEDOUBLE       ,  VALUE_NUMBER  , VAL_PROMOTEDOUBLE_DEFAULT                , PAGE_LANGUAGE    , GD_PROMOTEDOUBLE     , CYCLE_KIND    , "-fno-allow-single-precision" , VAL_PROMOTEDOUBLE_PROMOTETODOUBLE          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  244.     { OPTION_PROMOTEDOUBLE       ,  VALUE_NUMBER  , VAL_PROMOTEDOUBLE_DEFAULT                , PAGE_LANGUAGE    , GD_PROMOTEDOUBLE     , CYCLE_KIND    , "-fallow-single-precision"    , VAL_PROMOTEDOUBLE_ALLOWSINGLEPRECISION     , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  245.  
  246.     // optimizer page
  247.  
  248.     { OPTION_FASTCONSTRUCTOR     ,  VALUE_NUMBER  , VAL_FASTCONSTRUCTOR_DEFAULT              , PAGE_OPTIMIZER   , GD_FASTCONSTRUCTOR   , CYCLE_KIND    , "-felide-constructors"        , VAL_FASTCONSTRUCTOR_FASTCONSTRUCTOR        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  249.     { OPTION_FASTCONSTRUCTOR     ,  VALUE_NUMBER  , VAL_FASTCONSTRUCTOR_DEFAULT              , PAGE_OPTIMIZER   , GD_FASTCONSTRUCTOR   , CYCLE_KIND    , "-fno-elide-constructors"     , VAL_FASTCONSTRUCTOR_COPYCONSTRUCTOR        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  250.     { OPTION_IMPLICITETEMPLATES  ,  VALUE_NUMBER  , VAL_IMPLICITETEMPLATES_DEFAULT           , PAGE_OPTIMIZER   , GD_IMPLICITETEMPLATES, CYCLE_KIND    , "-fimplicit-templates"        , VAL_IMPLICITETEMPLATES_IMPLICITETEMPLATES  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  251.     { OPTION_IMPLICITETEMPLATES  ,  VALUE_NUMBER  , VAL_IMPLICITETEMPLATES_DEFAULT           , PAGE_OPTIMIZER   , GD_IMPLICITETEMPLATES, CYCLE_KIND    , "-fno-implicit-templates"     , VAL_IMPLICITETEMPLATES_NOIMPLICITETEMPLATES, 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  252.     { OPTION_OPTIMIZE            ,  VALUE_NUMBER  , VAL_OPTIMIZER_DEFAULT                    , PAGE_OPTIMIZER   , GD_OPTIMIZER         , CYCLE_KIND    , "-O1"                         , VAL_OPTIMIZER_OPTIMIZE                     , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  253.     { OPTION_OPTIMIZE            ,  VALUE_NUMBER  , VAL_OPTIMIZER_DEFAULT                    , PAGE_OPTIMIZER   , GD_OPTIMIZER         , CYCLE_KIND    , "-O2"                         , VAL_OPTIMIZER_OPTIMIZEMORE                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  254.     { OPTION_OPTIMIZE            ,  VALUE_NUMBER  , VAL_OPTIMIZER_DEFAULT                    , PAGE_OPTIMIZER   , GD_OPTIMIZER         , CYCLE_KIND    , "-O3"                         , VAL_OPTIMIZER_OPTIMIZEEVENMORE             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  255.     { OPTION_OPTIMIZE            ,  VALUE_NUMBER  , VAL_OPTIMIZER_DEFAULT                    , PAGE_OPTIMIZER   , GD_OPTIMIZER         , CYCLE_KIND    , "-Os"                         , VAL_OPTIMIZER_OPTIMIZESIZE                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  256.     { OPTION_OPTIMIZE            ,  VALUE_NUMBER  , VAL_OPTIMIZER_DEFAULT                    , PAGE_OPTIMIZER   , GD_OPTIMIZER         , CYCLE_KIND    , "-O0"                         , VAL_OPTIMIZER_NOOPTIMIZE                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  257.     { OPTION_FLOATSINFPU         ,  VALUE_NUMBER  , VAL_FLOATSINFPU_DEFAULT                  , PAGE_OPTIMIZER   , GD_FLOATSINFPU       , CYCLE_KIND    , "-fno-float-store"            , VAL_FLOATSINFPU_STOREFLOATSINFPU           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  258.     { OPTION_FLOATSINFPU         ,  VALUE_NUMBER  , VAL_FLOATSINFPU_DEFAULT                  , PAGE_OPTIMIZER   , GD_FLOATSINFPU       , CYCLE_KIND    , "-ffloat-store"               , VAL_FLOATSINFPU_STOREFLOATSINRAM           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  259.     { OPTION_DEFERPOP            ,  VALUE_NUMBER  , VAL_DEFERPOP_DEFAULT                     , PAGE_OPTIMIZER   , GD_DEFERPOP          , CYCLE_KIND    , "-fdefer-pop"                 , VAL_DEFERPOP_DEFERPOP                      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  260.     { OPTION_DEFERPOP            ,  VALUE_NUMBER  , VAL_DEFERPOP_DEFAULT                     , PAGE_OPTIMIZER   , GD_DEFERPOP          , CYCLE_KIND    , "-fno-defer-pop"              , VAL_DEFERPOP_NODEFERPOP                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  261.     { OPTION_COPYOPERANDS        ,  VALUE_NUMBER  , VAL_COPYOPERANDS_DEFAULT                 , PAGE_OPTIMIZER   , GD_COPYOPERANDS      , CYCLE_KIND    , "-fno-force-mem"              , VAL_COPYOPERANDS_NOCOPYOPERANDS            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  262.     { OPTION_COPYOPERANDS        ,  VALUE_NUMBER  , VAL_COPYOPERANDS_DEFAULT                 , PAGE_OPTIMIZER   , GD_COPYOPERANDS      , CYCLE_KIND    , "-fforce-mem"                 , VAL_COPYOPERANDS_COPYOPERANDS              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  263.     { OPTION_COPYPOINTERS        ,  VALUE_NUMBER  , VAL_COPYPOINTERS_DEFAULT                 , PAGE_OPTIMIZER   , GD_COPYPOINTERS      , CYCLE_KIND    , "-fno-force-addr"             , VAL_COPYPOINTERS_NOCOPYPOINTERS            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  264.     { OPTION_COPYPOINTERS        ,  VALUE_NUMBER  , VAL_COPYPOINTERS_DEFAULT                 , PAGE_OPTIMIZER   , GD_COPYPOINTERS      , CYCLE_KIND    , "-fforce-addr"                , VAL_COPYPOINTERS_COPYPOINTERS              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  265.     { OPTION_FRAMEPOINTER        ,  VALUE_NUMBER  , VAL_FRAMEPOINTER_DEFAULT                 , PAGE_OPTIMIZER   , GD_FRAMEPOINTER      , CYCLE_KIND    , "-fno-omit-frame-pointer"     , VAL_FRAMEPOINTER_FRAMEPOINTER              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  266.     { OPTION_FRAMEPOINTER        ,  VALUE_NUMBER  , VAL_FRAMEPOINTER_DEFAULT                 , PAGE_OPTIMIZER   , GD_FRAMEPOINTER      , CYCLE_KIND    , "-fomit-frame-pointer"        , VAL_FRAMEPOINTER_OPTIMIZEFRAMEPTR          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  267.     { OPTION_FASTMATH            ,  VALUE_NUMBER  , VAL_FASTMATH_DEFAULT                     , PAGE_OPTIMIZER   , GD_FASTMATH          , CYCLE_KIND    , "-fno-fast-math"              , VAL_FASTMATH_NOFASTMATH                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  268.     { OPTION_FASTMATH            ,  VALUE_NUMBER  , VAL_FASTMATH_DEFAULT                     , PAGE_OPTIMIZER   , GD_FASTMATH          , CYCLE_KIND    , "-ffast-math"                 , VAL_FASTMATH_FASTMATH                      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  269.     { OPTION_SAVEREGISTERS       ,  VALUE_NUMBER  , VAL_SAVEREGISTERS_DEFAULT                , PAGE_OPTIMIZER   , GD_SAVEREGISTERS     , CYCLE_KIND    , "-fno-caller-saves"           , VAL_SAVEREGISTERS_NOSAVEREGISTERS          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  270.     { OPTION_SAVEREGISTERS       ,  VALUE_NUMBER  , VAL_SAVEREGISTERS_DEFAULT                , PAGE_OPTIMIZER   , GD_SAVEREGISTERS     , CYCLE_KIND    , "-fcaller-saves"              , VAL_SAVEREGISTERS_SAVEREGISTERS            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  271.     { OPTION_PEEPHOLE            ,  VALUE_NUMBER  , VAL_PEEPHOLE_DEFAULT                     , PAGE_OPTIMIZER   , GD_PEEPHOLE          , CYCLE_KIND    , "-fpeephole"                  , VAL_PEEPHOLE_PEEPHOLEOPTIMIZER             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  272.     { OPTION_PEEPHOLE            ,  VALUE_NUMBER  , VAL_PEEPHOLE_DEFAULT                     , PAGE_OPTIMIZER   , GD_PEEPHOLE          , CYCLE_KIND    , "-fno-peephole"               , VAL_PEEPHOLE_NOPEEPHOLEOPTIMIZER           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  273.     { OPTION_SCHEDULER           ,  VALUE_NUMBER  , VAL_SCHEDULER_DEFAULT                    , PAGE_OPTIMIZER   , GD_SCHEDULER         , CYCLE_KIND    , "-fno-schedule-insns"         , VAL_SCHEDULER_NOSCHEDULER                  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  274.     { OPTION_SCHEDULER           ,  VALUE_NUMBER  , VAL_SCHEDULER_DEFAULT                    , PAGE_OPTIMIZER   , GD_SCHEDULER         , CYCLE_KIND    , "-fschedule-insns"            , VAL_SCHEDULER_SCHEDULER                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  275.     { OPTION_SCHEDULER           ,  VALUE_NUMBER  , VAL_SCHEDULER_DEFAULT                    , PAGE_OPTIMIZER   , GD_SCHEDULER         , CYCLE_KIND    , "-fschedule-insns2"           , VAL_SCHEDULER_TWOPASSSCHEDULER             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  276.     { OPTION_EXPENSIVEOPT        ,  VALUE_NUMBER  , VAL_EXPENSIVEOPT_DEFAULT                 , PAGE_OPTIMIZER   , GD_EXPENSIVEOPT      , CYCLE_KIND    , "-fno-expensive-optimizations", VAL_EXPENSIVEOPT_NOEXPENSIVEOPT            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  277.     { OPTION_EXPENSIVEOPT        ,  VALUE_NUMBER  , VAL_EXPENSIVEOPT_DEFAULT                 , PAGE_OPTIMIZER   , GD_EXPENSIVEOPT      , CYCLE_KIND    , "-fexpensive-optimizations"   , VAL_EXPENSIVEOPT_EXPENSIVEOPT              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  278.     { OPTION_ALIASING            ,  VALUE_NUMBER  , VAL_ALIASING_DEFAULT                     , PAGE_OPTIMIZER   , GD_ALIASING          , CYCLE_KIND    , "-fno-ict-aliasing"           , VAL_ALIASING_NOSTRICTALIASING              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  279.     { OPTION_ALIASING            ,  VALUE_NUMBER  , VAL_ALIASING_DEFAULT                     , PAGE_OPTIMIZER   , GD_ALIASING          , CYCLE_KIND    , "-fstrict-aliasing"           , VAL_ALIASING_STRICTALIASING                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  280.  
  281.     // linker page
  282.  
  283.     { OPTION_LINK                ,  VALUE_NUMBER  , VAL_LINKER_LINK                          , PAGE_LINKER      , GD_LINKER            , CYCLE_KIND    , "-c"                          , VAL_LINKER_NOLINK                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  284.     { OPTION_OBJECTS             ,  VALUE_LIST    , 0                                        , PAGE_LINKER      , GD_OBJECTS           , LISTVIEW_KIND , "-l*"                         , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  285.     { OPTION_LIBPATHS            ,  VALUE_LIST    , 0                                        , PAGE_LINKER      , GD_LIBPATHS          , LISTVIEW_KIND , "-L*"                         , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  286.     { OPTION_STARTUPCODE         ,  VALUE_NUMBER  , VAL_STARTUPCODE_STARTUPCODE              , PAGE_LINKER      , GD_STARTUPCODE       , CYCLE_KIND    , "-nostartfiles"               , VAL_STARTUPCODE_NOSTARTUPCODE              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  287.     { OPTION_STDLIBS             ,  VALUE_NUMBER  , VAL_STDLIBS_STANDARDLIBS                 , PAGE_LINKER      , GD_STDLIBS           , CYCLE_KIND    , "-nostdlib"                   , VAL_STDLIBS_NOSTANDARDLIBS                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  288.     { OPTION_DEFAULTLIBS         ,  VALUE_NUMBER  , VAL_DEFAULTLIBS_DEFAULTLIBS              , PAGE_LINKER      , GD_DEFAULTLIBS       , CYCLE_KIND    , "-nodefaultlibs"              , VAL_DEFAULTLIBS_NODEFAULTLIBS              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  289.     { OPTION_STRIPSYMBOLS        ,  VALUE_NUMBER  , VAL_STRIPSYMBOLS_NOSTRIPSYMBOLS          , PAGE_LINKER      , GD_STRIPSYMBOLS      , CYCLE_KIND    , "-s"                          , VAL_STRIPSYMBOLS_STRIPSYMBOLS              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  290.     { OPTION_DYNAMICLINKING      ,  VALUE_NUMBER  , VAL_DYNAMICLINKING_DYNAMICLINKING        , PAGE_LINKER      , GD_DYNAMICLINKING    , CYCLE_KIND    , "-static"                     , VAL_DYNAMICLINKING_STATICLINKING           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  291.     { OPTION_SHAREDOBJ           ,  VALUE_NUMBER  , VAL_SHAREDOBJ_NOSHAREDOBJECT             , PAGE_LINKER      , GD_SHAREDOBJ         , CYCLE_KIND    , "-shared"                     , VAL_SHAREDOBJ_SHAREDOBJECT                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  292.     { OPTION_SYMBOLICREFS        ,  VALUE_NUMBER  , VAL_SYMBOLICREFS_NOSYMBOLICREFS          , PAGE_LINKER      , GD_SYMBOLICREFS      , CYCLE_KIND    , "-symbolic"                   , VAL_SYMBOLICREFS_SYMBOLICREFS              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  293.     { OPTION_IXEMUL              ,  VALUE_NUMBER  , VAL_IXEMUL_IXEMUL                        , PAGE_LINKER      , GD_IXEMUL            , CYCLE_KIND    , "-noixemul"                   , VAL_IXEMUL_LIBNIX                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  294.  
  295.     // ppc page
  296.  
  297.     { OPTION_PPCBITALIGN         ,  VALUE_NUMBER  , VAL_PPCBITALIGN_DEFAULT                  , PAGE_PPC         , GD_PPCBITALIGN       , CYCLE_KIND    , "-mbit-align"                 , VAL_PPCBITALIGN_BITALIGN                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  298.     { OPTION_PPCBITALIGN         ,  VALUE_NUMBER  , VAL_PPCBITALIGN_DEFAULT                  , PAGE_PPC         , GD_PPCBITALIGN       , CYCLE_KIND    , "-mno-bit-align"              , VAL_PPCBITALIGN_NOBITALIGN                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  299.     { OPTION_PPCRELOCATABLE      ,  VALUE_NUMBER  , VAL_PPCRELOCATABLE_DEFAULT               , PAGE_PPC         , GD_PPCRELOCATABLE    , CYCLE_KIND    , "-mno-relocatable@"           , VAL_PPCRELOCATABLE_NORELOCATABLE           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  300.     { OPTION_PPCRELOCATABLE      ,  VALUE_NUMBER  , VAL_PPCRELOCATABLE_DEFAULT               , PAGE_PPC         , GD_PPCRELOCATABLE    , CYCLE_KIND    , "-mrelocatable"               , VAL_PPCRELOCATABLE_RELOCATBALE             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  301.     { OPTION_PPCFULLTOC          ,  VALUE_NUMBER  , VAL_PPCFULLTOC_DEFAULT                   , PAGE_PPC         , GD_PPCFULLTOC        , CYCLE_KIND    , "-mfull-toc"                  , VAL_PPCFULLTOC_FULLTOC                     , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  302.     { OPTION_PPCFULLTOC          ,  VALUE_NUMBER  , VAL_PPCFULLTOC_DEFAULT                   , PAGE_PPC         , GD_PPCFULLTOC        , CYCLE_KIND    , "-mminimal-toc"               , VAL_PPCFULLTOC_MINIMALTOC                  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  303.     { OPTION_PPCFMADD            ,  VALUE_NUMBER  , VAL_PPCFMADD_DEFAULT                     , PAGE_PPC         , GD_PPCFMADD          , CYCLE_KIND    , "-mfused-madd"                , VAL_PPCFMADD_USEFMADDFMSUB                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  304.     { OPTION_PPCFMADD            ,  VALUE_NUMBER  , VAL_PPCFMADD_DEFAULT                     , PAGE_PPC         , GD_PPCFMADD          , CYCLE_KIND    , "-mno-fused-madd"             , VAL_PPCFMADD_NOUSEFMADDFMSUB               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  305.     { OPTION_PPCABI              ,  VALUE_NUMBER  , VAL_PPCABI_DEFAULT                       , PAGE_PPC         , GD_PPCABI            , CYCLE_KIND    , "-maix32"                     , VAL_PPCABI_32BITABI                        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  306.     { OPTION_PPCABI              ,  VALUE_NUMBER  , VAL_PPCABI_DEFAULT                       , PAGE_PPC         , GD_PPCABI            , CYCLE_KIND    , "-maix64"                     , VAL_PPCABI_64BITABI                        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  307.     { OPTION_PPCFPU              ,  VALUE_NUMBER  , VAL_PPCFPU_DEFAULT                       , PAGE_PPC         , GD_PPCFPU            , CYCLE_KIND    , "-msoft-float"                , VAL_PPCFPU_NOFPU                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  308.     { OPTION_PPCFPU              ,  VALUE_NUMBER  , VAL_PPCFPU_DEFAULT                       , PAGE_PPC         , GD_PPCFPU            , CYCLE_KIND    , "-mhard-float"                , VAL_PPCFPU_FPU                             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  309.     { OPTION_PPCSTRICTALIGN      ,  VALUE_NUMBER  , VAL_PPCSTRICTALIGN_DEFAULT               , PAGE_PPC         , GD_PPCSTRICTALIGN    , CYCLE_KIND    , "-mstrict-align"              , VAL_PPCSTRICTALIGN_STRICTALIGN             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  310.     { OPTION_PPCSTRICTALIGN      ,  VALUE_NUMBER  , VAL_PPCSTRICTALIGN_DEFAULT               , PAGE_PPC         , GD_PPCSTRICTALIGN    , CYCLE_KIND    , "-mno-strict-align"           , VAL_PPCSTRICTALIGN_NOSTRICTALIGN           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  311.     { OPTION_PPCRELOCATABLELIB   ,  VALUE_NUMBER  , VAL_PPCRELOCATABLELIB_DEFAULT            , PAGE_PPC         , GD_PPCRELOCATABLELIB , CYCLE_KIND    , "-mno-relocatable-lib"        , VAL_PPCRELOCATABLELIB_NORELOCATABLELIB     , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  312.     { OPTION_PPCRELOCATABLELIB   ,  VALUE_NUMBER  , VAL_PPCRELOCATABLELIB_DEFAULT            , PAGE_PPC         , GD_PPCRELOCATABLELIB , CYCLE_KIND    , "-mrelocatable-lib"           , VAL_PPCRELOCATABLELIB_RELOCATABLELIB       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  313.     { OPTION_PPCTOC              ,  VALUE_NUMBER  , VAL_PPCTOC_DEFAULT                       , PAGE_PPC         , GD_PPCTOC            , CYCLE_KIND    , "-mtoc"                       , VAL_PPCTOC_TOC                             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  314.     { OPTION_PPCTOC              ,  VALUE_NUMBER  , VAL_PPCTOC_DEFAULT                       , PAGE_PPC         , GD_PPCTOC            , CYCLE_KIND    , "-mno-toc"                    , VAL_PPCTOC_NOTOC                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  315.     { OPTION_PPCENDIAN           ,  VALUE_NUMBER  , VAL_PPCENDIAN_DEFAULT                    , PAGE_PPC         , GD_PPCENDIAN         , CYCLE_KIND    , "-mlittle-endian"             , VAL_PPCENDIAN_LITTLEENDIAN                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  316.     { OPTION_PPCENDIAN           ,  VALUE_NUMBER  , VAL_PPCENDIAN_DEFAULT                    , PAGE_PPC         , GD_PPCENDIAN         , CYCLE_KIND    , "-mlittle"                    , VAL_PPCENDIAN_LITTLEENDIAN                 , RULE_DONOTSAVE  ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  317.     { OPTION_PPCENDIAN           ,  VALUE_NUMBER  , VAL_PPCENDIAN_DEFAULT                    , PAGE_PPC         , GD_PPCENDIAN         , CYCLE_KIND    , "-mbig-endian"                , VAL_PPCENDIAN_BIGENDIAN                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  318.     { OPTION_PPCENDIAN           ,  VALUE_NUMBER  , VAL_PPCENDIAN_DEFAULT                    , PAGE_PPC         , GD_PPCENDIAN         , CYCLE_KIND    , "-mbig"                       , VAL_PPCENDIAN_BIGENDIAN                    , RULE_DONOTSAVE  ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  319.     { OPTION_PPCCALL             ,  VALUE_NUMBER  , VAL_PPCCALL_DEFAULT                      , PAGE_PPC         , GD_PPCCALL           , CYCLE_KIND    , "-mcall-sysv"                 , VAL_PPCCALL_CALLSSYSIV                     , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  320.     { OPTION_PPCCALL             ,  VALUE_NUMBER  , VAL_PPCCALL_DEFAULT                      , PAGE_PPC         , GD_PPCCALL           , CYCLE_KIND    , "-mcall-aix"                  , VAL_PPCCALL_CALLSAIX                       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  321.     { OPTION_PPCCALL             ,  VALUE_NUMBER  , VAL_PPCCALL_DEFAULT                      , PAGE_PPC         , GD_PPCCALL           , CYCLE_KIND    , "-mcall-linux"                , VAL_PPCCALL_CALLSLINUX                     , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  322.     { OPTION_PPCCALL             ,  VALUE_NUMBER  , VAL_PPCCALL_DEFAULT                      , PAGE_PPC         , GD_PPCCALL           , CYCLE_KIND    , "-mcall-solaris"              , VAL_PPCCALL_CALLSSOLARIS                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  323.     { OPTION_PPCPROTOTYPED       ,  VALUE_NUMBER  , VAL_PPCPROTOTYPED_DEFAULT                , PAGE_PPC         , GD_PPCPROTOTYPED     , CYCLE_KIND    , "-mprototype"                 , VAL_PPCPROTOTYPED_PROTOTYPED               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  324.     { OPTION_PPCPROTOTYPED       ,  VALUE_NUMBER  , VAL_PPCPROTOTYPED_DEFAULT                , PAGE_PPC         , GD_PPCPROTOTYPED     , CYCLE_KIND    , "-mno-prototype"              , VAL_PPCPROTOTYPED_NOPROTOTYPED             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  325.     { OPTION_PPCEABI             ,  VALUE_NUMBER  , VAL_PPCEABI_DEFAULT                      , PAGE_PPC         , GD_PPCEABI           , CYCLE_KIND    , "-meabi"                      , VAL_PPCEABI_EMBEDDEDABI                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  326.     { OPTION_PPCEABI             ,  VALUE_NUMBER  , VAL_PPCEABI_DEFAULT                      , PAGE_PPC         , GD_PPCEABI           , CYCLE_KIND    , "-mno-eabi"                   , VAL_PPCEABI_NOEMBEDDEDABI                  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  327.     { OPTION_PPCDATA             ,  VALUE_NUMBER  , VAL_PPCDATA_DEFAULT                      , PAGE_PPC         , GD_PPCDATA           , CYCLE_KIND    , "-msdata=default"             , VAL_PPCDATA_DATADEFAULT                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  328.     { OPTION_PPCDATA             ,  VALUE_NUMBER  , VAL_PPCDATA_DEFAULT                      , PAGE_PPC         , GD_PPCDATA           , CYCLE_KIND    , "-msdata"                     , VAL_PPCDATA_DATADEFAULT                    , RULE_DONOTSAVE  ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  329.     { OPTION_PPCDATA             ,  VALUE_NUMBER  , VAL_PPCDATA_DEFAULT                      , PAGE_PPC         , GD_PPCDATA           , CYCLE_KIND    , "-msdata=eabi"                , VAL_PPCDATA_DATAEABI                       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  330.     { OPTION_PPCDATA             ,  VALUE_NUMBER  , VAL_PPCDATA_DEFAULT                      , PAGE_PPC         , GD_PPCDATA           , CYCLE_KIND    , "-msdata=sysv"                , VAL_PPCDATA_DATASYSV                       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  331.     { OPTION_PPCDATA             ,  VALUE_NUMBER  , VAL_PPCDATA_DEFAULT                      , PAGE_PPC         , GD_PPCDATA           , CYCLE_KIND    , "-msdata=none"                , VAL_PPCDATA_DATANONE                       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  332.     { OPTION_PPCDATA             ,  VALUE_NUMBER  , VAL_PPCDATA_DEFAULT                      , PAGE_PPC         , GD_PPCDATA           , CYCLE_KIND    , "-mno-sdata"                  , VAL_PPCDATA_DATANONE                       , RULE_DONOTSAVE  ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  333.  
  334.     // debugger page
  335.  
  336.     { OPTION_DEBUG               ,  VALUE_NUMBER  , VAL_DEBUG_NODEBUG                        , PAGE_DEBUGGER    , GD_DEBUG             , CYCLE_KIND    , "-g"                          , VAL_DEBUG_DEBUG                            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  337.     { OPTION_DEBUG               ,  VALUE_NUMBER  , VAL_DEBUG_NODEBUG                        , PAGE_DEBUGGER    , GD_DEBUG             , CYCLE_KIND    , "-ggdb"                       , VAL_DEBUG_DEBUGGDB                         , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  338.     { OPTION_DEBUG               ,  VALUE_NUMBER  , VAL_DEBUG_NODEBUG                        , PAGE_DEBUGGER    , GD_DEBUG             , CYCLE_KIND    , "-gstabs"                     , VAL_DEBUG_DEBUGSTABS                       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  339.     { OPTION_DEBUG               ,  VALUE_NUMBER  , VAL_DEBUG_NODEBUG                        , PAGE_DEBUGGER    , GD_DEBUG             , CYCLE_KIND    , "-gstabs+"                    , VAL_DEBUG_DEBUGSTABSPLUS                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  340.     { OPTION_DEBUG               ,  VALUE_NUMBER  , VAL_DEBUG_NODEBUG                        , PAGE_DEBUGGER    , GD_DEBUG             , CYCLE_KIND    , "-gcoff"                      , VAL_DEBUG_DEBUGCOFF                        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  341.     { OPTION_DEBUG               ,  VALUE_NUMBER  , VAL_DEBUG_NODEBUG                        , PAGE_DEBUGGER    , GD_DEBUG             , CYCLE_KIND    , "-gxcoff"                     , VAL_DEBUG_DEBUGXCOFF                       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  342.     { OPTION_DEBUG               ,  VALUE_NUMBER  , VAL_DEBUG_NODEBUG                        , PAGE_DEBUGGER    , GD_DEBUG             , CYCLE_KIND    , "-gxcoff+"                    , VAL_DEBUG_DEBUGXCOFFPLUS                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  343.     { OPTION_DEBUG               ,  VALUE_NUMBER  , VAL_DEBUG_NODEBUG                        , PAGE_DEBUGGER    , GD_DEBUG             , CYCLE_KIND    , "-gdwarf"                     , VAL_DEBUG_DEBUGDWARF                       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  344.     { OPTION_DEBUG               ,  VALUE_NUMBER  , VAL_DEBUG_NODEBUG                        , PAGE_DEBUGGER    , GD_DEBUG             , CYCLE_KIND    , "-gdwarf+"                    , VAL_DEBUG_DEBUGDWARFPLUS                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  345.     { OPTION_DEBUG               ,  VALUE_NUMBER  , VAL_DEBUG_NODEBUG                        , PAGE_DEBUGGER    , GD_DEBUG             , CYCLE_KIND    , "-gdwarf-2"                   , VAL_DEBUG_DEBUGDWARF2                      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  346.     { OPTION_PROFILE             ,  VALUE_NUMBER  , VAL_PROFILE_NOPROFILE                    , PAGE_DEBUGGER    , GD_PROFILE           , CYCLE_KIND    , "-p"                          , VAL_PROFILE_PROFILE                        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  347.     { OPTION_PROFILE             ,  VALUE_NUMBER  , VAL_PROFILE_NOPROFILE                    , PAGE_DEBUGGER    , GD_PROFILE           , CYCLE_KIND    , "-pg"                         , VAL_PROFILE_PROFILEGPROF                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  348.     { OPTION_PROFILEBLOCKS       ,  VALUE_NUMBER  , VAL_PROFILEBLOCKS_NOPROFILEBLOCKS        , PAGE_DEBUGGER    , GD_PROFILEBLOCKS     , CYCLE_KIND    , "-a"                          , VAL_PROFILEBLOCKS_PROFILEBLOCKS            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  349.     { OPTION_PROFILEBLOCKS       ,  VALUE_NUMBER  , VAL_PROFILEBLOCKS_NOPROFILEBLOCKS        , PAGE_DEBUGGER    , GD_PROFILEBLOCKS     , CYCLE_KIND    , "-ax"                         , VAL_PROFILEBLOCKS_PROFILEBLOCKSEXTRA       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  350.     { OPTION_ARCS                ,  VALUE_NUMBER  , VAL_ARCS_DEFAULT                         , PAGE_DEBUGGER    , GD_ARCS              , CYCLE_KIND    , "-fno-profile-arcs"           , VAL_ARCS_NOARCS                            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  351.     { OPTION_ARCS                ,  VALUE_NUMBER  , VAL_ARCS_DEFAULT                         , PAGE_DEBUGGER    , GD_ARCS              , CYCLE_KIND    , "-fprofile-arcs"              , VAL_ARCS_ARCS                              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  352.     { OPTION_COVERAGE            ,  VALUE_NUMBER  , VAL_COVERAGE_DEFAULT                     , PAGE_DEBUGGER    , GD_COVERAGE          , CYCLE_KIND    , "-fno-test-coverage"          , VAL_COVERAGE_NOCOVERAGE                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  353.     { OPTION_COVERAGE            ,  VALUE_NUMBER  , VAL_COVERAGE_DEFAULT                     , PAGE_DEBUGGER    , GD_COVERAGE          , CYCLE_KIND    , "-ftest-coverage"             , VAL_COVERAGE_SAVECOVERAGEDATA              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  354.     { OPTION_DEBUGLEVEL          ,  VALUE_NUMBER  , VAL_DEBUGLEVEL_DEFAULT                   , PAGE_DEBUGGER    , GD_DEBUGLEVEL        , CYCLE_KIND    , "-g1"                         , VAL_DEBUGLEVEL_DEBUGLEVEL1                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  355.     { OPTION_DEBUGLEVEL          ,  VALUE_NUMBER  , VAL_DEBUGLEVEL_DEFAULT                   , PAGE_DEBUGGER    , GD_DEBUGLEVEL        , CYCLE_KIND    , "-g2"                         , VAL_DEBUGLEVEL_DEBUGLEVEL2                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  356.     { OPTION_DEBUGLEVEL          ,  VALUE_NUMBER  , VAL_DEBUGLEVEL_DEFAULT                   , PAGE_DEBUGGER    , GD_DEBUGLEVEL        , CYCLE_KIND    , "-g3"                         , VAL_DEBUGLEVEL_DEBUGLEVEL3                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  357.  
  358.     // cplusplus page
  359.  
  360.     { OPTION_ACCESSCONTROL       ,  VALUE_NUMBER  , VAL_ACCESSCONTROL_DEFAULT                , PAGE_CPLUSPLUS   , GD_ACCESSCONTROL     , CYCLE_KIND    , "-faccess-control"            , VAL_ACCESSCONTROL_ACCESSCONTROL            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  361.     { OPTION_ACCESSCONTROL       ,  VALUE_NUMBER  , VAL_ACCESSCONTROL_DEFAULT                , PAGE_CPLUSPLUS   , GD_ACCESSCONTROL     , CYCLE_KIND    , "-fno-access-control"         , VAL_ACCESSCONTROL_NOACCESSCONTROL          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  362.     { OPTION_CHECKNEW            ,  VALUE_NUMBER  , VAL_CHECKNEW_DEFAULT                     , PAGE_CPLUSPLUS   , GD_CHECKNEW          , CYCLE_KIND    , "-fno-check-new"              , VAL_CHECKNEW_NOCHECKNEW                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  363.     { OPTION_CHECKNEW            ,  VALUE_NUMBER  , VAL_CHECKNEW_DEFAULT                     , PAGE_CPLUSPLUS   , GD_CHECKNEW          , CYCLE_KIND    , "-fcheck-new"                 , VAL_CHECKNEW_CHECKNEW                      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  364.     { OPTION_ACCEPTDOLLAR        ,  VALUE_NUMBER  , VAL_ACCEPTDOLLAR_DEFAULT                 , PAGE_CPLUSPLUS   , GD_ACCEPTDOLLAR      , CYCLE_KIND    , "-fdollars-in-identifiers"    , VAL_ACCEPTDOLLAR_ACCEPTDOLLAR              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  365.     { OPTION_ACCEPTDOLLAR        ,  VALUE_NUMBER  , VAL_ACCEPTDOLLAR_DEFAULT                 , PAGE_CPLUSPLUS   , GD_ACCEPTDOLLAR      , CYCLE_KIND    , "-fno-dollars-in-identifiers" , VAL_ACCEPTDOLLAR_NOACCEPTDOLLAR            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  366.     { OPTION_FORSCOPE            ,  VALUE_NUMBER  , VAL_FORSCOPE_DEFAULT                     , PAGE_CPLUSPLUS   , GD_FORSCOPE          , CYCLE_KIND    , "-ffor-scope"                 , VAL_FORSCOPE_FORLOOPSCOPE                  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  367.     { OPTION_FORSCOPE            ,  VALUE_NUMBER  , VAL_FORSCOPE_DEFAULT                     , PAGE_CPLUSPLUS   , GD_FORSCOPE          , CYCLE_KIND    , "-fno-for-scope"              , VAL_FORSCOPE_NOFORLOOPSCOPE                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  368.     { OPTION_GNUKEYWORDS         ,  VALUE_NUMBER  , VAL_GNUKEYWORDS_DEFAULT                  , PAGE_CPLUSPLUS   , GD_GNUKEYWORDS       , CYCLE_KIND    , "-fgnu-keywords"              , VAL_GNUKEYWORDS_GNUKEYWORDS                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  369.     { OPTION_GNUKEYWORDS         ,  VALUE_NUMBER  , VAL_GNUKEYWORDS_DEFAULT                  , PAGE_CPLUSPLUS   , GD_GNUKEYWORDS       , CYCLE_KIND    , "-fno-gnu-keywords"           , VAL_GNUKEYWORDS_NOGNUKEYWORDS              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  370.     { OPTION_SIGNATURES          ,  VALUE_NUMBER  , VAL_SIGNATURES_DEFAULT                   , PAGE_CPLUSPLUS   , GD_SIGNATURES        , CYCLE_KIND    , "-fno-handle-signatures"      , VAL_SIGNATURES_NOSIGNATURES                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  371.     { OPTION_SIGNATURES          ,  VALUE_NUMBER  , VAL_SIGNATURES_DEFAULT                   , PAGE_CPLUSPLUS   , GD_SIGNATURES        , CYCLE_KIND    , "-fhandle-signatures"         , VAL_SIGNATURES_HANDLESIGNATURES            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  372.     { OPTION_STDNAMESPACE        ,  VALUE_NUMBER  , VAL_STDNAMESPACE_DEFAULT                 , PAGE_CPLUSPLUS   , GD_STDNAMESPACE      , CYCLE_KIND    , "-fno-honor-std"              , VAL_STDNAMESPACE_IGNORESTDNAMESPACE        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  373.     { OPTION_STDNAMESPACE        ,  VALUE_NUMBER  , VAL_STDNAMESPACE_DEFAULT                 , PAGE_CPLUSPLUS   , GD_STDNAMESPACE      , CYCLE_KIND    , "-fhonor-std"                 , VAL_STDNAMESPACE_NOIGNORESTDNAMESPACE      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  374.     { OPTION_MANGLING            ,  VALUE_NUMBER  , VAL_MANGLING_DEFAULT                     , PAGE_CPLUSPLUS   , GD_MANGLING          , CYCLE_KIND    , "-fname-mangling-version-1"   , VAL_MANGLING_NEW                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  375.     { OPTION_MANGLING            ,  VALUE_NUMBER  , VAL_MANGLING_DEFAULT                     , PAGE_CPLUSPLUS   , GD_MANGLING          , CYCLE_KIND    , "-fname-mangling-version-0"   , VAL_MANGLING_OLD                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  376.     { OPTION_OPERATORNAMES       ,  VALUE_NUMBER  , VAL_OPERATORNAMES_DEFAULT                , PAGE_CPLUSPLUS   , GD_OPERATORNAMES     , CYCLE_KIND    , "-fno-operator-names"         , VAL_OPERATORNAMES_NOOPERATORNAMES          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  377.     { OPTION_OPERATORNAMES       ,  VALUE_NUMBER  , VAL_OPERATORNAMES_DEFAULT                , PAGE_CPLUSPLUS   , GD_OPERATORNAMES     , CYCLE_KIND    , "-foperator-names"            , VAL_OPERATORNAMES_OPERATORNAMES            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  378.     { OPTION_RTTI                ,  VALUE_NUMBER  , VAL_RTTI_DEFAULT                         , PAGE_CPLUSPLUS   , GD_RTTI              , CYCLE_KIND    , "-frtti"                      , VAL_RTTI_RTTI                              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  379.     { OPTION_RTTI                ,  VALUE_NUMBER  , VAL_RTTI_DEFAULT                         , PAGE_CPLUSPLUS   , GD_RTTI              , CYCLE_KIND    , "-fno-rtti"                   , VAL_RTTI_NORTTI                            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  380.     { OPTION_STRICTPROTOS        ,  VALUE_NUMBER  , VAL_STRICTPROTOS_DEFAULT                 , PAGE_CPLUSPLUS   , GD_STRICTPROTOS      , CYCLE_KIND    , "-fno-strict-prototype"       , VAL_STRICTPROTOS_NOSTRICTPROTOS            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  381.     { OPTION_STRICTPROTOS        ,  VALUE_NUMBER  , VAL_STRICTPROTOS_DEFAULT                 , PAGE_CPLUSPLUS   , GD_STRICTPROTOS      , CYCLE_KIND    , "-fstrict-prototype"          , VAL_STRICTPROTOS_STRICTPROTOS              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  382.     { OPTION_LONGMANGLING        ,  VALUE_NUMBER  , VAL_LONGMANGLING_DEFAULT                 , PAGE_CPLUSPLUS   , GD_LONGMANGLING      , CYCLE_KIND    , "-fno-squangle"               , VAL_LONGMANGLING_LONGNAMEMANGLING          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  383.     { OPTION_LONGMANGLING        ,  VALUE_NUMBER  , VAL_LONGMANGLING_DEFAULT                 , PAGE_CPLUSPLUS   , GD_LONGMANGLING      , CYCLE_KIND    , "-fsquangle"                  , VAL_LONGMANGLING_COMPRESSEDMANGLING        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  384.     { OPTION_ASSIGNTOTHIS        ,  VALUE_NUMBER  , VAL_ASSIGNTOTHIS_DEFAULT                 , PAGE_CPLUSPLUS   , GD_ASSIGNTOTHIS      , CYCLE_KIND    , "-fno-this-is-variable"       , VAL_ASSIGNTOTHIS_NOASSIGNTOTHIS            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  385.     { OPTION_ASSIGNTOTHIS        ,  VALUE_NUMBER  , VAL_ASSIGNTOTHIS_DEFAULT                 , PAGE_CPLUSPLUS   , GD_ASSIGNTOTHIS      , CYCLE_KIND    , "-fthis-is-variable"          , VAL_ASSIGNTOTHIS_ASSIGNTOTHIS              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  386.  
  387.     // inline page
  388.  
  389.     { OPTION_INLINECLASS         ,  VALUE_NUMBER  , VAL_INLINECLASS_DEFAULT                  , PAGE_INLINE      , GD_INLINECLASS       , CYCLE_KIND    , "-fdefault-inline"            , VAL_INLINECLASS_INLINECLASSFUNC            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  390.     { OPTION_INLINECLASS         ,  VALUE_NUMBER  , VAL_INLINECLASS_DEFAULT                  , PAGE_INLINE      , GD_INLINECLASS       , CYCLE_KIND    , "-fno-default-inline"         , VAL_INLINECLASS_NOINLINECLASSFUNC          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  391.     { OPTION_INLINEDIRECTIVE     ,  VALUE_NUMBER  , VAL_INLINECLASS_DEFAULT                  , PAGE_INLINE      , GD_INLINEDIRECTIVE   , CYCLE_KIND    , "-finline"                    , VAL_INLINEDIRECTIVE_INLINEDIRECTIVE        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  392.     { OPTION_INLINEDIRECTIVE     ,  VALUE_NUMBER  , VAL_INLINECLASS_DEFAULT                  , PAGE_INLINE      , GD_INLINEDIRECTIVE   , CYCLE_KIND    , "-fno-inline"                 , VAL_INLINEDIRECTIVE_IGNOREINLINEDIRECTIVE  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  393.     { OPTION_DELETEINLINED       ,  VALUE_NUMBER  , VAL_DELETEINLINED_DEFAULT                , PAGE_INLINE      , GD_DELETEINLINED     , CYCLE_KIND    , "-fno-keep-inline-functions"  , VAL_DELETEINLINED_DELETEINLINEDFUNC        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  394.     { OPTION_DELETEINLINED       ,  VALUE_NUMBER  , VAL_DELETEINLINED_DEFAULT                , PAGE_INLINE      , GD_DELETEINLINED     , CYCLE_KIND    , "-fkeep-inline-functions"     , VAL_DELETEINLINED_KEEPINLINEDFUNC          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  395.     { OPTION_AUTOINLINE          ,  VALUE_NUMBER  , VAL_AUTOINLINE_DEFAULT                   , PAGE_INLINE      , GD_AUTOINLINE        , CYCLE_KIND    , "-fno-inline-functions"       , VAL_AUTOINLINE_NOAUTOMATICINLINE           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  396.     { OPTION_AUTOINLINE          ,  VALUE_NUMBER  , VAL_AUTOINLINE_DEFAULT                   , PAGE_INLINE      , GD_AUTOINLINE        , CYCLE_KIND    , "-finline-functions"          , VAL_AUTOINLINE_INLINESMALLFUNCTIONS        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  397.     { OPTION_INLINELIMIT         ,  VALUE_NUMERIC , 0                                        , PAGE_INLINE      , GD_INLINELIMIT       , STRING_KIND   , "-finline-limit-*"            , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  398.  
  399.     // details page
  400.  
  401.     { OPTION_STRENGTHREDUCE      ,  VALUE_NUMBER  , VAL_STRENGTHREDUCE_DEFAULT               , PAGE_DETAILS     , GD_STRENGTHREDUCE    , CYCLE_KIND    , "-fno-strength-reduce"        , VAL_STRENGTHREDUCE_NOSTRENGTHREDUCE        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  402.     { OPTION_STRENGTHREDUCE      ,  VALUE_NUMBER  , VAL_STRENGTHREDUCE_DEFAULT               , PAGE_DETAILS     , GD_STRENGTHREDUCE    , CYCLE_KIND    , "-fstrength-reduce"           , VAL_STRENGTHREDUCE_STRENGTHREDUCE          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  403.     { OPTION_THREADJUMPS         ,  VALUE_NUMBER  , VAL_THREADJUMPS_DEFAULT                  , PAGE_DETAILS     , GD_THREADJUMPS       , CYCLE_KIND    , "-fno-thread-jumps"           , VAL_THREADJUMPS_NOTHREADJUMPS              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  404.     { OPTION_THREADJUMPS         ,  VALUE_NUMBER  , VAL_THREADJUMPS_DEFAULT                  , PAGE_DETAILS     , GD_THREADJUMPS       , CYCLE_KIND    , "-fthread-jumps"              , VAL_THREADJUMPS_THREADJUMPS                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  405.     { OPTION_CSEFOLLOWJUMPS      ,  VALUE_NUMBER  , VAL_CSEFOLLOWJUMPS_DEFAULT               , PAGE_DETAILS     , GD_CSEFOLLOWJUMPS    , CYCLE_KIND    , "-fno-cse-follow-jumps"       , VAL_CSEFOLLOWJUMPS_NOCSEFOLLOWJUMPS        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  406.     { OPTION_CSEFOLLOWJUMPS      ,  VALUE_NUMBER  , VAL_CSEFOLLOWJUMPS_DEFAULT               , PAGE_DETAILS     , GD_CSEFOLLOWJUMPS    , CYCLE_KIND    , "-fcse-follow-jumps"          , VAL_CSEFOLLOWJUMPS_CSEFOLLOWJUMPS          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  407.     { OPTION_CSESKIPBLOCKS       ,  VALUE_NUMBER  , VAL_CSESKIPBLOCKS_DEFAULT                , PAGE_DETAILS     , GD_CSESKIPBLOCKS     , CYCLE_KIND    , "-fno-cse-skip-blocks"        , VAL_CSESKIPBLOCKS_NOCSESKIPBLOCKS          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  408.     { OPTION_CSESKIPBLOCKS       ,  VALUE_NUMBER  , VAL_CSESKIPBLOCKS_DEFAULT                , PAGE_DETAILS     , GD_CSESKIPBLOCKS     , CYCLE_KIND    , "-fcse-skip-blocks"           , VAL_CSESKIPBLOCKS_CSESKIPBLOCKS            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  409.     { OPTION_FUNCTIONCSE         ,  VALUE_NUMBER  , VAL_FUNCTIONCSE_DEFAULT                  , PAGE_DETAILS     , GD_FUNCTIONCSE       , CYCLE_KIND    , "-ffunction-cse"              , VAL_FUNCTIONCSE_FUNCTIONCSE                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  410.     { OPTION_FUNCTIONCSE         ,  VALUE_NUMBER  , VAL_FUNCTIONCSE_DEFAULT                  , PAGE_DETAILS     , GD_FUNCTIONCSE       , CYCLE_KIND    , "-fno-function-cse"           , VAL_FUNCTIONCSE_NOFUNCTIONCSE              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  411.     { OPTION_RERUNCSE            ,  VALUE_NUMBER  , VAL_RERUNCSE_DEFAULT                     , PAGE_DETAILS     , GD_RERUNCSE          , CYCLE_KIND    , "-fno-rerun-cse-after-loop"   , VAL_RERUNCSE_NORERUNCSE                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  412.     { OPTION_RERUNCSE            ,  VALUE_NUMBER  , VAL_RERUNCSE_DEFAULT                     , PAGE_DETAILS     , GD_RERUNCSE          , CYCLE_KIND    , "-frerun-cse-after-loop"      , VAL_RERUNCSE_RERUNCSE                      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  413.     { OPTION_RERUNLOOPOPT        ,  VALUE_NUMBER  , VAL_RERUNLOOPOPT_DEFAULT                 , PAGE_DETAILS     , GD_RERUNLOOPOPT      , CYCLE_KIND    , "-fno-rerun-loop-opt"         , VAL_RERUNLOOPOPT_NORERUNLOOPOPT            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  414.     { OPTION_RERUNLOOPOPT        ,  VALUE_NUMBER  , VAL_RERUNLOOPOPT_DEFAULT                 , PAGE_DETAILS     , GD_RERUNLOOPOPT      , CYCLE_KIND    , "-frerun-loop-opt"            , VAL_RERUNLOOPOPT_RERUNLOOPOPTIMIZER        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  415.     { OPTION_GLOBALCSEPASS       ,  VALUE_NUMBER  , VAL_GLOBALCSEPASS_DEFAULT                , PAGE_DETAILS     , GD_GLOBALCSEPASS     , CYCLE_KIND    , "-fno-gcse"                   , VAL_GLOBALCSEPASS_NOGLOBALCSEPASS          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  416.     { OPTION_GLOBALCSEPASS       ,  VALUE_NUMBER  , VAL_GLOBALCSEPASS_DEFAULT                , PAGE_DETAILS     , GD_GLOBALCSEPASS     , CYCLE_KIND    , "-fgcse"                      , VAL_GLOBALCSEPASS_GLOBALCSEPASS            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  417.     { OPTION_OPTIMIZEMOVE        ,  VALUE_NUMBER  , VAL_OPTIMIZEMOVE_DEFAULT                 , PAGE_DETAILS     , GD_OPTIMIZEMOVE      , CYCLE_KIND    , "-fno-regmove"                , VAL_OPTIMIZEMOVE_NOOPTIMIZEMOVE            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  418.     { OPTION_OPTIMIZEMOVE        ,  VALUE_NUMBER  , VAL_OPTIMIZEMOVE_DEFAULT                 , PAGE_DETAILS     , GD_OPTIMIZEMOVE      , CYCLE_KIND    , "-fregmove"                   , VAL_OPTIMIZEMOVE_OPTIMIZEMOVE              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  419.     { OPTION_DELAYEDBRANCH       ,  VALUE_NUMBER  , VAL_DELAYEDBRANCH_DEFAULT                , PAGE_DETAILS     , GD_DELAYEDBRANCH     , CYCLE_KIND    , "-fno-delayed-branch"         , VAL_DELAYEDBRANCH_NODELAYEDBRANCH          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  420.     { OPTION_DELAYEDBRANCH       ,  VALUE_NUMBER  , VAL_DELAYEDBRANCH_DEFAULT                , PAGE_DETAILS     , GD_DELAYEDBRANCH     , CYCLE_KIND    , "-fdelayed-branch"            , VAL_DELAYEDBRANCH_DELAYEDBRANCH            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  421.     { OPTION_SEPARATEFUNCS       ,  VALUE_NUMBER  , VAL_SEPARATEFUNCS_DEFAULT                , PAGE_DETAILS     , GD_SEPARATEFUNCS     , CYCLE_KIND    , "-fno-function-sections"      , VAL_SEPARATEFUNCS_NOSEPARATESECTIONS       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  422.     { OPTION_SEPARATEFUNCS       ,  VALUE_NUMBER  , VAL_SEPARATEFUNCS_DEFAULT                , PAGE_DETAILS     , GD_SEPARATEFUNCS     , CYCLE_KIND    , "-ffunction-sections"         , VAL_SEPARATEFUNCS_SEPARATESECTIONS         , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  423.     { OPTION_SEPARATEDATA        ,  VALUE_NUMBER  , VAL_SEPARATEDATA_DEFAULT                 , PAGE_DETAILS     , GD_SEPARATEDATA      , CYCLE_KIND    , "-fno-data-sections"          , VAL_SEPARATEDATA_NOSEPARATESECTIONS        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  424.     { OPTION_SEPARATEDATA        ,  VALUE_NUMBER  , VAL_SEPARATEDATA_DEFAULT                 , PAGE_DETAILS     , GD_SEPARATEDATA      , CYCLE_KIND    , "-fdata-sections"             , VAL_SEPARATEDATA_SEPARATESECTIONS          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  425.     { OPTION_UNROLLLOOPS         ,  VALUE_NUMBER  , VAL_UNROLLLOOPS_DEFAULT                  , PAGE_DETAILS     , GD_UNROLLLOOPS       , CYCLE_KIND    , "-fno-unroll-loops"           , VAL_UNROLLLOOPS_NOUNROLLLOOPS              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  426.     { OPTION_UNROLLLOOPS         ,  VALUE_NUMBER  , VAL_UNROLLLOOPS_DEFAULT                  , PAGE_DETAILS     , GD_UNROLLLOOPS       , CYCLE_KIND    , "-funroll-loops"              , VAL_UNROLLLOOPS_UNROLLLOOPS                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  427.     { OPTION_UNROLLALLLOOPS      ,  VALUE_NUMBER  , VAL_UNROLLALLLOOPS_DEFAULT               , PAGE_DETAILS     , GD_UNROLLALLLOOPS    , CYCLE_KIND    , "-fno-unroll-all-loops"       , VAL_UNROLLALLLOOPS_NOUNROLLALLLOOPS        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  428.     { OPTION_UNROLLALLLOOPS      ,  VALUE_NUMBER  , VAL_UNROLLALLLOOPS_DEFAULT               , PAGE_DETAILS     , GD_UNROLLALLLOOPS    , CYCLE_KIND    , "-funroll-all-loops"          , VAL_UNROLLALLLOOPS_UNROLLALLLOOPS          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  429.     { OPTION_MOVEMOVEABLE        ,  VALUE_NUMBER  , VAL_MOVEMOVEABLE_DEFAULT                 , PAGE_DETAILS     , GD_MOVEMOVEABLE      , CYCLE_KIND    , "-fno-move-all-movables"      , VAL_MOVEMOVEABLE_NOMOVEMOVEABLE            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  430.     { OPTION_MOVEMOVEABLE        ,  VALUE_NUMBER  , VAL_MOVEMOVEABLE_DEFAULT                 , PAGE_DETAILS     , GD_MOVEMOVEABLE      , CYCLE_KIND    , "-fmove-all-movables"         , VAL_MOVEMOVEABLE_MOVEMOVEABLE              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  431.     { OPTION_REDUCEALLVARS       ,  VALUE_NUMBER  , VAL_REDUCEALLVARS_DEFAULT                , PAGE_DETAILS     , GD_REDUCEALLVARS     , CYCLE_KIND    , "-fno-reduce-all-givs"        , VAL_REDUCEALLVARS_NOREDUCEALLVARS          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  432.     { OPTION_REDUCEALLVARS       ,  VALUE_NUMBER  , VAL_REDUCEALLVARS_DEFAULT                , PAGE_DETAILS     , GD_REDUCEALLVARS     , CYCLE_KIND    , "-freduce-all-givs"           , VAL_REDUCEALLVARS_REDUCEALLVARS            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  433.     { OPTION_BRANCHPROBABILITY   ,  VALUE_NUMBER  , VAL_BRANCHPROBABILITY_DEFAULT            , PAGE_DETAILS     , GD_BRANCHPROBABILITY , CYCLE_KIND    , "-fno-branch-probabilities"   , VAL_BRANCHPROBABILITY_NOBRANCHPROBAB       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  434.     { OPTION_BRANCHPROBABILITY   ,  VALUE_NUMBER  , VAL_BRANCHPROBABILITY_DEFAULT            , PAGE_DETAILS     , GD_BRANCHPROBABILITY , CYCLE_KIND    , "-fbranch-probabilities"      , VAL_BRANCHPROBABILITY_BRANCHPROBABILITIES  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  435.     { OPTION_KEEPCONST           ,  VALUE_NUMBER  , VAL_KEEPCONST_DEFAULT                    , PAGE_DETAILS     , GD_KEEPCONST         , CYCLE_KIND    , "-fno-keep-static-consts"     , VAL_KEEPCONST_KEEPUNUSEDCONST              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  436.     { OPTION_KEEPCONST           ,  VALUE_NUMBER  , VAL_KEEPCONST_DEFAULT                    , PAGE_DETAILS     , GD_KEEPCONST         , CYCLE_KIND    , "-fkeep-static-consts"        , VAL_KEEPCONST_DELETEUNUSEDCONST            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  437.                                                                                                                                       
  438.     // preprocessor page
  439.  
  440.     { OPTION_STRIPCOMMENTS       ,  VALUE_NUMBER  , VAL_STRIPCOMMENTS_STRIPCOMMENTS          , PAGE_PREPROCESSOR, GD_STRIPCOMMENTS     , CYCLE_KIND    , "-C"                          , VAL_STRIPCOMMENTS_NOSTRIPCOMMENTS          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  441.     { OPTION_DEFINEMACROS        ,  VALUE_NUMBER  , VAL_DEFINEMACROS_DEFINEMACROS            , PAGE_PREPROCESSOR, GD_DEFINEMACROS      , CYCLE_KIND    , "-undef"                      , VAL_DEFINEMACROS_NODEFINEMACROS            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  442.     { OPTION_LINENUMBERS         ,  VALUE_NUMBER  , VAL_LINENUMBERS_GENLINENUMBERS           , PAGE_PREPROCESSOR, GD_LINENUMBERS       , CYCLE_KIND    , "-P"                          , VAL_LINENUMBERS_NOGENLINENUMBERS           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  443.     { OPTION_DEFINES             ,  VALUE_LIST    , 0                                        , PAGE_PREPROCESSOR, GD_DEFINES           , LISTVIEW_KIND , "-D*"                         , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  444.     { OPTION_UNDEFINES           ,  VALUE_LIST    , 0                                        , PAGE_PREPROCESSOR, GD_UNDEFINES         , LISTVIEW_KIND , "-U*"                         , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  445.     { OPTION_TRADITIONALCPP      ,  VALUE_NUMBER  , VAL_TRADITIONALCPP_NOTRADITIONALCPP      , PAGE_PREPROCESSOR, GD_TRADITIONALCPP    , CYCLE_KIND    , "-traditional-cpp"            , VAL_TRADITIONALCPP_TRADIONALCPP            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  446.  
  447.     // m68k page
  448.  
  449.     { OPTION_M68KFPU             ,  VALUE_NUMBER  , VAL_M68KFPU_NOFPU                        , PAGE_M68K        , GD_M68KFPU           , CYCLE_KIND    , "-m68881"                     , VAL_M68KFPU_FPU68881                       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  450.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-m68000"                     , VAL_CPU_CPU68000                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  451.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-m68020"                     , VAL_CPU_CPU68020                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  452.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-m68030"                     , VAL_CPU_CPU68030                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  453.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-m68040"                     , VAL_CPU_CPU68040                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  454.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-m68060"                     , VAL_CPU_CPU68060                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  455.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-m68020-40"                  , VAL_CPU_CPU6802068040                      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  456.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-m68020-60"                  , VAL_CPU_CPU6802068060                      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  457.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-mcpu=powerpc"               , VAL_CPU_POWERPC                            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  458.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-mcpu=601"                   , VAL_CPU_601                                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  459.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-mcpu=602"                   , VAL_CPU_602                                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  460.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-mcpu=603"                   , VAL_CPU_603                                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  461.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-mcpu=603e"                  , VAL_CPU_603E                               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  462.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-mcpu=604"                   , VAL_CPU_604                                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  463.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-mcpu=604e"                  , VAL_CPU_604E                               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  464.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-mcpu=620"                   , VAL_CPU_620                                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  465.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-mcpu=740"                   , VAL_CPU_740                                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  466.     { OPTION_CPU                 ,  VALUE_NUMBER  , VAL_CPU_DEFAULT                          , PAGE_M68K        , GD_CPU               , CYCLE_KIND    , "-mcpu=750"                   , VAL_CPU_750                                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  467.     { OPTION_M68KSOFTFLOAT       ,  VALUE_NUMBER  , VAL_M68KSOFTFLOAT_NOSOFTFLOAT            , PAGE_M68K        , GD_M68KSOFTFLOAT     , CYCLE_KIND    , "-msoft-float"                , VAL_M68KSOFTFLOAT_SOFTFLOAT                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  468.     { OPTION_M68KLONGINT         ,  VALUE_NUMBER  , VAL_M68KLONGINT_INT32BIT                 , PAGE_M68K        , GD_M68KLONGINT       , CYCLE_KIND    , "-mshort"                     , VAL_M68KLONGINT_INT16BIT                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  469.     { OPTION_M68KRTS             ,  VALUE_NUMBER  , VAL_M68KRTS_RETURNWITHRTS                , PAGE_M68K        , GD_M68KRTS           , CYCLE_KIND    , "-mrtd"                       , VAL_M68KRTS_RETURNWITHRTD                  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  470.     { OPTION_M68KALIGN           ,  VALUE_NUMBER  , VAL_M68KALIGN_DEFAULT                    , PAGE_M68K        , GD_M68KALIGN         , CYCLE_KIND    , "-mno-align-int"              , VAL_M68KALIGN_NO32BITALIGN                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  471.     { OPTION_M68KALIGN           ,  VALUE_NUMBER  , VAL_M68KALIGN_DEFAULT                    , PAGE_M68K        , GD_M68KALIGN         , CYCLE_KIND    , "-malign-int"                 , VAL_M68KALIGN_32BITALIGN                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  472.     { OPTION_M68KFARCODE         ,  VALUE_NUMBER  , VAL_M68KFARCODE_CODEFAR                  , PAGE_M68K        , GD_M68KFARCODE       , CYCLE_KIND    , "-msmall-code"                , VAL_M68KFARCODE_CODENEAR                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  473.     { OPTION_M68KFARDATA         ,  VALUE_NUMBER  , VAL_M68KFARDATA_DATADEFAULT              , PAGE_M68K        , GD_M68KFARDATA       , CYCLE_KIND    , "-fno-baserel"                , VAL_M68KFARDATA_DATAFAR                    , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  474.     { OPTION_M68KFARDATA         ,  VALUE_NUMBER  , VAL_M68KFARDATA_DATADEFAULT              , PAGE_M68K        , GD_M68KFARDATA       , CYCLE_KIND    , "-fbaserel"                   , VAL_M68KFARDATA_DATANEAR16                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  475.     { OPTION_M68KFARDATA         ,  VALUE_NUMBER  , VAL_M68KFARDATA_DATADEFAULT              , PAGE_M68K        , GD_M68KFARDATA       , CYCLE_KIND    , "-fbaserel32"                 , VAL_M68KFARDATA_DATANEAR32                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  476.     { OPTION_M68KFARDATA         ,  VALUE_NUMBER  , VAL_M68KFARDATA_DATADEFAULT              , PAGE_M68K        , GD_M68KFARDATA       , CYCLE_KIND    , "-resident"                   , VAL_M68KFARDATA_DATARESIDENT16             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  477.     { OPTION_M68KFARDATA         ,  VALUE_NUMBER  , VAL_M68KFARDATA_DATADEFAULT              , PAGE_M68K        , GD_M68KFARDATA       , CYCLE_KIND    , "-resident32"                 , VAL_M68KFARDATA_DATARESIDENT32             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  478.     { OPTION_M68KSTACKCHECK      ,  VALUE_NUMBER  , VAL_M68KSTACKCHECK_DEFAULT               , PAGE_M68K        , GD_M68KSTACKCHECK    , CYCLE_KIND    , "-mno-stackcheck"             , VAL_M68KSTACKCHECK_NOSTACKCHECK            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  479.     { OPTION_M68KSTACKCHECK      ,  VALUE_NUMBER  , VAL_M68KSTACKCHECK_DEFAULT               , PAGE_M68K        , GD_M68KSTACKCHECK    , CYCLE_KIND    , "-mstackcheck"                , VAL_M68KSTACKCHECK_STACKCHECK              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  480.     { OPTION_M68KSTACKEXTEND     ,  VALUE_NUMBER  , VAL_M68KSTACKEXTEND_DEFAULT              , PAGE_M68K        , GD_M68KSTACKEXTEND   , CYCLE_KIND    , "-mno-stackextend"            , VAL_M68KSTACKEXTEND_NOSTACKEXTEND          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  481.     { OPTION_M68KSTACKEXTEND     ,  VALUE_NUMBER  , VAL_M68KSTACKEXTEND_DEFAULT              , PAGE_M68K        , GD_M68KSTACKEXTEND   , CYCLE_KIND    , "-mstackextend"               , VAL_M68KSTACKEXTEND_STACKEXTEND            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  482.     { OPTION_M68KRELOADA4        ,  VALUE_NUMBER  , VAL_M68KRELOADA4_DEFAULT                 , PAGE_M68K        , GD_M68KRELOADA4      , CYCLE_KIND    , "-mno-restore-a4"             , VAL_M68KRELOADA4_NORELOADA4                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  483.     { OPTION_M68KRELOADA4        ,  VALUE_NUMBER  , VAL_M68KRELOADA4_DEFAULT                 , PAGE_M68K        , GD_M68KRELOADA4      , CYCLE_KIND    , "-mrestore-a4"                , VAL_M68KRELOADA4_RELOADA4                  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  484.     { OPTION_M68KRELOADA4        ,  VALUE_NUMBER  , VAL_M68KRELOADA4_DEFAULT                 , PAGE_M68K        , GD_M68KRELOADA4      , CYCLE_KIND    , "-malways-restore-a4"         , VAL_M68KRELOADA4_ALWAYSRELOADA4            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  485.     { OPTION_M68KPARMS           ,  VALUE_NUMBER  , VAL_M68KPARMS_PARMSSTACK                 , PAGE_M68K        , GD_M68KPARMS         , CYCLE_KIND    , "-mregparm"                   , VAL_M68KPARMS_PARMSREGISTERS               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  486.     { OPTION_M68KPARMS           ,  VALUE_NUMBER  , VAL_M68KPARMS_PARMSSTACK                 , PAGE_M68K        , GD_M68KPARMS         , CYCLE_KIND    , "-mregparm=1"                 , VAL_M68KPARMS_PARMSREGISTERS1              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  487.     { OPTION_M68KPARMS           ,  VALUE_NUMBER  , VAL_M68KPARMS_PARMSSTACK                 , PAGE_M68K        , GD_M68KPARMS         , CYCLE_KIND    , "-mregparm=2"                 , VAL_M68KPARMS_PARMSREGISTERS2              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  488.     { OPTION_M68KPARMS           ,  VALUE_NUMBER  , VAL_M68KPARMS_PARMSSTACK                 , PAGE_M68K        , GD_M68KPARMS         , CYCLE_KIND    , "-mregparm=3"                 , VAL_M68KPARMS_PARMSREGISTERS3              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  489.     { OPTION_M68KPARMS           ,  VALUE_NUMBER  , VAL_M68KPARMS_PARMSSTACK                 , PAGE_M68K        , GD_M68KPARMS         , CYCLE_KIND    , "-mregparm=4"                 , VAL_M68KPARMS_PARMSREGISTERS4              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  490.  
  491.     // OPTION_OPTIONS is last entry to catch unknown options ("*" template)
  492.  
  493.     { OPTION_OPTIONS             ,  VALUE_LIST    , 0                                        , PAGE_SPECIAL     , GD_OPTIONS           , LISTVIEW_KIND , "*"                           , UNDEFINED                                  , 0               ,   NULL,      NULL,      SYNTAX_ACTIVE   },
  494.  
  495.     OPTIONS_MAXIMUM
  496. };
  497.  
  498. /* ---------------------------------- PageLayout -------------------------------
  499.  
  500.  Layouts of dialog pages, in order of PAGE_ID (!)
  501.  
  502. */
  503.  
  504. struct PageLayout Layouts[PAGE_MAXIMUM] =
  505. {
  506.     // gadgets count     gadget tags         gadget types        gadget data       textual labels
  507.  
  508.     { INDEX_CNT       , INDEXGTags       ,  INDEXGTypes       , INDEXNGad       , NULL           },
  509.     { COMPILER_CNT    , COMPILERGTags    ,  COMPILERGTypes    , COMPILERNGad    , NULL           },
  510.     { MESSAGES_CNT    , MESSAGESGTags    ,  MESSAGESGTypes    , MESSAGESNGad    , NULL           },
  511.     { LANGUAGE_CNT    , LANGUAGEGTags    ,  LANGUAGEGTypes    , LANGUAGENGad    , LANGUAGEIText  },
  512.     { OPTIMIZER_CNT   , OPTIMIZERGTags   ,  OPTIMIZERGTypes   , OPTIMIZERNGad   , OPTIMIZERIText },
  513.     { LINKER_CNT      , LINKERGTags      ,  LINKERGTypes      , LINKERNGad      , NULL           },
  514.     { SPECIAL_CNT     , SPECIALGTags     ,  SPECIALGTypes     , SPECIALNGad     , NULL           },
  515.     { PPC_CNT         , PPCGTags         ,  PPCGTypes         , PPCNGad         , PPCIText       },
  516.     { DEBUGGER_CNT    , DEBUGGERGTags    ,  DEBUGGERGTypes    , DEBUGGERNGad    , DEBUGGERIText  },
  517.     { CPLUSPLUS_CNT   , CPLUSPLUSGTags   ,  CPLUSPLUSGTypes   , CPLUSPLUSNGad   , CPLUSPLUSIText },
  518.     { INLINE_CNT      , INLINEGTags      ,  INLINEGTypes      , INLINENGad      , NULL           },
  519.     { DETAILS_CNT     , DETAILSGTags     ,  DETAILSGTypes     , DETAILSNGad     , DETAILSIText   },
  520.     { PREPROCESSOR_CNT, PREPROCESSORGTags,  PREPROCESSORGTypes, PREPROCESSORNGad, NULL           },
  521.     { M68K_CNT        , M68KGTags        ,  M68KGTypes        , M68KNGad        , M68KIText      },
  522. };
  523.  
  524. /* -------------------------------- Suggestions --------------------------------
  525.  
  526.  Possible values for some (list-style-)options
  527.  
  528. */
  529.  
  530. UBYTE *SuggestionsForWarnings[] =
  531. {
  532.     "aggregate-return",
  533.     "bad-function-cast",
  534.     "cast-align",
  535.     "cast-qual",
  536.     "char-subscripts",
  537.     "comment",
  538.     "conversion",
  539.     "error-implicit-function-declaration",
  540.     "format",
  541.     "id-clash-LEN",
  542.     "implicit",
  543.     "implicit-function",
  544.     "implicit-function-declaration",
  545.     "implicit-int",
  546.     "import",
  547.     "inline",
  548.     "larger-than-LEN",
  549.     "long-long",
  550.     "main",
  551.     "missing-declarations",
  552.     "missing-noreturn",
  553.     "missing-prototypes",
  554.     "multichar",
  555.     "nested-externs",
  556.     "parentheses",
  557.     "pointer-arith",
  558.     "redundant-decls",
  559.     "return-type",
  560.     "shadow",
  561.     "sign-compare",
  562.     "strict-prototypes",
  563.     "switch",
  564.     "traditional",
  565.     "trigraphs",
  566.     "undef",
  567.     "uninitialized",
  568.     "unknown-pragmas",
  569.     "unused",
  570.     "write-strings",
  571.  
  572.     NULL
  573. };
  574.  
  575. #endif
  576.  
  577. ///
  578. /// "globals (vbcc)"
  579.  
  580. #ifdef TARGET_VBCC
  581.  
  582. /* ------------------------------- Connectivity --------------------------------
  583.  
  584.  The connectivity table describes how gadgets interact
  585.  
  586. */
  587.  
  588. struct Connectivity Connectivity[] =
  589. {
  590.       // DIALOG PAGE       GADGET (SOURCE)        GADGET (TARGET)   ACTION
  591.  
  592.     { PAGE_INDEX,          GD_ASKCONFIG,          GD_VCCCONFIG,     ACTION_REQFILENAME },
  593.  
  594.     { PAGE_COMPILER,       GD_INCLUDES,           GD_INCLUDES,      ACTION_REFRESH     },
  595.     { PAGE_COMPILER,       GD_ADDINCLUDE,         GD_INCLUDES,      ACTION_REQFOLDER   },
  596.     { PAGE_COMPILER,       GD_DELINCLUDE,         GD_INCLUDES,      ACTION_DEL         },
  597.     { PAGE_COMPILER,       GD_EDITINCLUDE,        GD_INCLUDES,      ACTION_EDIT        },
  598.  
  599.     { PAGE_COMPILER,       GD_DEFINES,            GD_DEFINES,       ACTION_REFRESH     },
  600.     { PAGE_COMPILER,       GD_ADDDEFINE,          GD_DEFINES,       ACTION_ADD         },
  601.     { PAGE_COMPILER,       GD_DELDEFINE,          GD_DEFINES,       ACTION_DEL         },
  602.     { PAGE_COMPILER,       GD_EDITDEFINE,         GD_DEFINES,       ACTION_EDIT        },
  603.  
  604.     { PAGE_MESSAGES,       GD_ENABLED,            GD_ENABLED,       ACTION_REFRESH     },
  605.     { PAGE_MESSAGES,       GD_ADDENABLED,         GD_ENABLED,       ACTION_ADD         },
  606.     { PAGE_MESSAGES,       GD_DELENABLED,         GD_ENABLED,       ACTION_DEL         },
  607.     { PAGE_MESSAGES,       GD_EDITENABLED,        GD_ENABLED,       ACTION_EDIT        },
  608.  
  609.     { PAGE_MESSAGES,       GD_DISABLED,           GD_DISABLED,      ACTION_REFRESH     },
  610.     { PAGE_MESSAGES,       GD_ADDDISABLED,        GD_DISABLED,      ACTION_ADD         },
  611.     { PAGE_MESSAGES,       GD_DELDISABLED,        GD_DISABLED,      ACTION_DEL         },
  612.     { PAGE_MESSAGES,       GD_EDITDISABLED,       GD_DISABLED,      ACTION_EDIT        },
  613.  
  614.     { PAGE_LINKER,         GD_OBJECTS,            GD_OBJECTS,       ACTION_REFRESH     },
  615.     { PAGE_LINKER,         GD_ADDOBJECT,          GD_OBJECTS,       ACTION_REQFILE     },
  616.     { PAGE_LINKER,         GD_DELOBJECT,          GD_OBJECTS,       ACTION_DEL         },
  617.     { PAGE_LINKER,         GD_EDITOBJECT,         GD_OBJECTS,       ACTION_EDIT        },
  618.  
  619.     { PAGE_LINKER,         GD_LIBPATHS,           GD_LIBPATHS,      ACTION_REFRESH     },
  620.     { PAGE_LINKER,         GD_ADDLIBPATH,         GD_LIBPATHS,      ACTION_REQFOLDER   },
  621.     { PAGE_LINKER,         GD_DELLIBPATH,         GD_LIBPATHS,      ACTION_DEL         },
  622.     { PAGE_LINKER,         GD_EDITLIBPATH,        GD_LIBPATHS,      ACTION_EDIT        },
  623.  
  624.     { PAGE_SPECIAL,        GD_OPTIONS,            GD_OPTIONS,       ACTION_REFRESH     },
  625.     { PAGE_SPECIAL,        GD_ADDOPTION,          GD_OPTIONS,       ACTION_ADD         },
  626.     { PAGE_SPECIAL,        GD_DELOPTION,          GD_OPTIONS,       ACTION_DEL         },
  627.     { PAGE_SPECIAL,        GD_EDITOPTION,         GD_OPTIONS,       ACTION_EDIT        },
  628.  
  629.     PAGE_MAXIMUM
  630. };
  631.  
  632. /* ------------------------------------ Syntax ---------------------------------
  633.  
  634.  Global syntax table with "rules". This table describes all options, their
  635.  default values, associated gadgets etc. Order in this table is important if
  636.  entries have similar templates. For example, "-dontwarn=-1" is listed before
  637.  "-dontwarn=*" because it is a specal case of "-dontwarn=*" (and as such has
  638.  higher precedence). Options which are displayed on multiple pages have a
  639.  RULE_DONOTSAVE flag set in their secondary entry (and an empty template)
  640.  because the secondary entry will only be used to sync with the GUI, not for
  641.  parsing configuration files.
  642.  
  643. */
  644.  
  645. struct Syntax Syntax[] =
  646. {
  647.     // OPTION IDENTIFIER            OPTION TYPE     DEFAULT VALUE                                DIALOG PAGE      GADGET ID              GADGET TYPE     TEMPLATE (or NULL)              VALUE ASSOCIATED WITH TEMPLATE               FLAGS               ACTIVATOR DEACTIVATOR STATUS
  648.  
  649.     // index page
  650.  
  651.     { OPTION_VCCONFIG             , VALUE_STRING  , 0                                          , PAGE_INDEX     , GD_VCCCONFIG         , STRING_KIND   , "+*"                          , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  652.     { OPTION_COPYRIGHT            , VALUE_NUMBER  , OPTION_COPYRIGHT_COPYRIGHT                 , PAGE_INDEX     , GD_COPYRIGHT         , CYCLE_KIND    , "-quiet"                      , OPTION_COPYRIGHT_NOCOPYRIGHT               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  653.     { OPTION_VERBOSE              , VALUE_NUMBER  , OPTION_VERBOSE_NOVERBOSE                   , PAGE_INDEX     , GD_VERBOSE           , CYCLE_KIND    , "-vv"                         , OPTION_VERBOSE_VERYVERBOSE                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  654.     { OPTION_VERBOSE              , VALUE_NUMBER  , OPTION_VERBOSE_NOVERBOSE                   , PAGE_INDEX     , GD_VERBOSE           , CYCLE_KIND    , "-v"                          , OPTION_VERBOSE_VERBOSE                     , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  655.     { OPTION_LINK                 , VALUE_NUMBER  , OPTION_LINK_LINK                           , PAGE_INDEX     , GD_LINK              , CYCLE_KIND    , NULL                          , UNDEFINED                                  , RULE_DONOTSAVE  ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  656.     { OPTION_OPTIMIZE             , VALUE_NUMBER  , OPTION_OPTIMIZE_NOOPTIMIZE                 , PAGE_INDEX     , GD_OPTIMIZE          , CYCLE_KIND    , NULL                          , UNDEFINED                                  , RULE_DONOTSAVE  ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  657.  
  658.     // code page
  659.  
  660.     { OPTION_CONST                , VALUE_NUMBER  , OPTION_CONST_CONSTDATACODE                 , PAGE_CODE      , GD_CONST             , CYCLE_KIND    , "-const-in-data"              , OPTION_CONST_CONSTDATADATA                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  661.     { OPTION_CPU                  , VALUE_NUMBER  , OPTION_CPU_ANY                             , PAGE_CODE      , GD_CPU               , CYCLE_KIND    , "-cpu=68000"                  , OPTION_CPU_ANY                             , RULE_DONOTSAVE  ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  662.     { OPTION_CPU                  , VALUE_NUMBER  , OPTION_CPU_ANY                             , PAGE_CODE      , GD_CPU               , CYCLE_KIND    , "-cpu=68010"                  , OPTION_CPU_68010                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  663.     { OPTION_CPU                  , VALUE_NUMBER  , OPTION_CPU_ANY                             , PAGE_CODE      , GD_CPU               , CYCLE_KIND    , "-cpu=68020"                  , OPTION_CPU_68020                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  664.     { OPTION_CPU                  , VALUE_NUMBER  , OPTION_CPU_ANY                             , PAGE_CODE      , GD_CPU               , CYCLE_KIND    , "-cpu=68030"                  , OPTION_CPU_68030                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  665.     { OPTION_CPU                  , VALUE_NUMBER  , OPTION_CPU_ANY                             , PAGE_CODE      , GD_CPU               , CYCLE_KIND    , "-cpu=68040"                  , OPTION_CPU_68040                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  666.     { OPTION_CPU                  , VALUE_NUMBER  , OPTION_CPU_ANY                             , PAGE_CODE      , GD_CPU               , CYCLE_KIND    , "-cpu=68060"                  , OPTION_CPU_68060                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  667.     { OPTION_DOUBLEPUSH           , VALUE_NUMBER  , OPTION_DOUBLEPUSH_NODOUBLEPUSH             , PAGE_CODE      , GD_DOUBLEPUSH        , CYCLE_KIND    , "-double-push"                , OPTION_DOUBLEPUSH_DOUBLEPUSH               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  668.     { OPTION_MATH                 , VALUE_NUMBER  , OPTION_MATH_NOMATH                         , PAGE_CODE      , GD_MATH              , CYCLE_KIND    , "-lmieee"                     , OPTION_MATH_IEEE                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  669.     { OPTION_MATH                 , VALUE_NUMBER  , OPTION_MATH_NOMATH                         , PAGE_CODE      , GD_MATH              , CYCLE_KIND    , "-lm040"                      , OPTION_MATH_68040                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  670.     { OPTION_MATH                 , VALUE_NUMBER  , OPTION_MATH_NOMATH                         , PAGE_CODE      , GD_MATH              , CYCLE_KIND    , "-lm881"                      , OPTION_MATH_68881                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  671.     { OPTION_MATH                 , VALUE_NUMBER  , OPTION_MATH_NOMATH                         , PAGE_CODE      , GD_MATH              , CYCLE_KIND    , "-fpu=68000"                  , OPTION_MATH_IEEE                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  672.     { OPTION_MATH                 , VALUE_NUMBER  , OPTION_MATH_NOMATH                         , PAGE_CODE      , GD_MATH              , CYCLE_KIND    , "-fpu=68010"                  , OPTION_MATH_68881                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  673.     { OPTION_MATH                 , VALUE_NUMBER  , OPTION_MATH_NOMATH                         , PAGE_CODE      , GD_MATH              , CYCLE_KIND    , "-fpu=68020"                  , OPTION_MATH_68881                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  674.     { OPTION_MATH                 , VALUE_NUMBER  , OPTION_MATH_NOMATH                         , PAGE_CODE      , GD_MATH              , CYCLE_KIND    , "-fpu=68030"                  , OPTION_MATH_68881                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  675.     { OPTION_MATH                 , VALUE_NUMBER  , OPTION_MATH_NOMATH                         , PAGE_CODE      , GD_MATH              , CYCLE_KIND    , "-fpu=68040"                  , OPTION_MATH_68040                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  676.     { OPTION_MATH                 , VALUE_NUMBER  , OPTION_MATH_NOMATH                         , PAGE_CODE      , GD_MATH              , CYCLE_KIND    , "-fpu=68060"                  , OPTION_MATH_68040                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  677.     { OPTION_MATH                 , VALUE_NUMBER  , OPTION_MATH_NOMATH                         , PAGE_CODE      , GD_MATH              , CYCLE_KIND    , "-fpu=68881"                  , OPTION_MATH_68881                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  678.     { OPTION_MATH                 , VALUE_NUMBER  , OPTION_MATH_NOMATH                         , PAGE_CODE      , GD_MATH              , CYCLE_KIND    , "-lm"                         , OPTION_MATH_ANY                            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  679.     { OPTION_PROFILE              , VALUE_NUMBER  , OPTION_PROFILE_NOPROFILE                   , PAGE_CODE      , GD_PROFILE           , CYCLE_KIND    , "-prof"                       , OPTION_PROFILE_PROFILE                     , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  680.     { OPTION_LARGECODE            , VALUE_NUMBER  , OPTION_LARGECODE_LARGECODE                 , PAGE_CODE      , GD_LARGECODE         , CYCLE_KIND    , "-sc"                         , OPTION_LARGECODE_SMALLCODE                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  681.     { OPTION_LARGEDATA            , VALUE_NUMBER  , OPTION_LARGEDATA_LARGEDATA                 , PAGE_CODE      , GD_LARGEDATA         , CYCLE_KIND    , "-sd"                         , OPTION_LARGEDATA_SMALLDATA                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  682.     { OPTION_STACKCHECK           , VALUE_NUMBER  , OPTION_STACKCHECK_NOSTACKCHECK             , PAGE_CODE      , GD_STACKCHECK        , CYCLE_KIND    , "-stack-check"                , OPTION_STACKCHECK_STACKCHECK               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  683.  
  684.     // compiler page
  685.  
  686.     { OPTION_CPPCOMMENTS          , VALUE_NUMBER  , OPTION_CPPCOMMENTS_NOCPPCOMMENTS           , PAGE_COMPILER  , GD_CPPCOMMENTS       , CYCLE_KIND    , "-cpp-comments"               , OPTION_CPPCOMMENTS_CPPCOMMENTS             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  687.     { OPTION_CPPCOMMENTS          , VALUE_NUMBER  , OPTION_CPPCOMMENTS_NOCPPCOMMENTS           , PAGE_COMPILER  , GD_CPPCOMMENTS       , CYCLE_KIND    , "-+"                          , OPTION_CPPCOMMENTS_CPPCOMMENTS             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  688.     { OPTION_C99                  , VALUE_NUMBER  , OPTION_C99_ISOC1989                        , PAGE_COMPILER  , GD_C99               , CYCLE_KIND    , "-c99"                        , OPTION_C99_ISOC1999                        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  689.     { OPTION_DEFINES              , VALUE_LIST    , 0                                          , PAGE_COMPILER  , GD_DEFINES           , LISTVIEW_KIND , "-D*"                         , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  690.     { OPTION_PREPROCESSED         , VALUE_NUMBER  , OPTION_PREPROCESSED_NOPREPROCESSED         , PAGE_COMPILER  , GD_PREPROCESSED      , CYCLE_KIND    , "-E"                          , OPTION_PREPROCESSED_KEEPPREPROCESSED       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  691.     { OPTION_MEMSIZE              , VALUE_NUMBER  , OPTION_MEMSIZE_MEMSIZEHUGE                 , PAGE_COMPILER  , GD_MEMSIZE           , CYCLE_KIND    , "-dontkeep-initialized-data"  , OPTION_MEMSIZE_MEMSIZESMALL                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  692.     { OPTION_DEBUG                , VALUE_NUMBER  , OPTION_DEBUG_NODEBUG                       , PAGE_COMPILER  , GD_DEBUG             , CYCLE_KIND    , "-g"                          , OPTION_DEBUG_DEBUG                         , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  693.     { OPTION_DEBUGHUNK            , VALUE_NUMBER  , OPTION_DEBUGHUNK_DEBUGHUNKDWARF2           , PAGE_COMPILER  , GD_DEBUGHUNK         , CYCLE_KIND    , "-hunkdebug"                  , OPTION_DEBUGHUNK_DEBUGHUNKAMIGA            , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  694.     { OPTION_INCLUDES             , VALUE_LIST    , 0                                          , PAGE_COMPILER  , GD_INCLUDES          , LISTVIEW_KIND , "-I*"                         , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  695.     { OPTION_INDERMEDIATE         , VALUE_NUMBER  , OPTION_INTERMEDIATE_NOINTERMEDIATE         , PAGE_COMPILER  , GD_INTERMEDIATE      , CYCLE_KIND    , "-k"                          , OPTION_INTERMEDIATE_KEEPINTERMEDIATE       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  696.     { OPTION_ASSEMBLE             , VALUE_NUMBER  , OPTION_ASSEMBLE_ASSEMBLE                   , PAGE_COMPILER  , GD_ASSEMBLE          , CYCLE_KIND    , "-S"                          , OPTION_ASSEMBLE_NOASSEMBLE                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  697.  
  698.     // linker page
  699.  
  700.     { OPTION_EXTRALIB             , VALUE_NUMBER  , OPTION_EXTRALIB_NOEXTRALIB                 , PAGE_LINKER    , GD_EXTRALIB          , CYCLE_KIND    , "-lextra"                     , OPTION_EXTRALIB_EXTRALIB                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  701.     { OPTION_LIBPATHS             , VALUE_LIST    , 0                                          , PAGE_LINKER    , GD_LIBPATHS          , LISTVIEW_KIND , "-L*"                         , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  702.     { OPTION_OBJECTS              , VALUE_LIST    , 0                                          , PAGE_LINKER    , GD_OBJECTS           , LISTVIEW_KIND , "-l*"                         , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  703.     { OPTION_LINK                 , VALUE_NUMBER  , OPTION_LINK_LINK                           , PAGE_LINKER    , GD_LINKER            , CYCLE_KIND    , "-c"                          , OPTION_LINK_NOLINK                         , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  704.     { OPTION_STDLIB               , VALUE_NUMBER  , OPTION_STDLIB_STDLIB                       , PAGE_LINKER    , GD_STDLIB            , CYCLE_KIND    , "-nostdlib"                   , OPTION_STDLIB_NOSTDLIB                     , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  705.  
  706.     // messages page
  707.  
  708.     { OPTION_WARNINGS             , VALUE_NUMBER  , OPTION_WARNINGS_WARNINGS                   , PAGE_MESSAGES  , GD_WARNINGS          , CYCLE_KIND    , "-warn=-1"                    , OPTION_WARNINGS_ALLWARNINGSON              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  709.     { OPTION_WARNINGS             , VALUE_NUMBER  , OPTION_WARNINGS_WARNINGS                   , PAGE_MESSAGES  , GD_WARNINGS          , CYCLE_KIND    , "-dontwarn=-1"                , OPTION_WARNINGS_ALLWARNINGSOFF             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  710.     { OPTION_ENABLED              , VALUE_LIST    , 0                                          , PAGE_MESSAGES  , GD_ENABLED           , LISTVIEW_KIND , "-warn=*"                     , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  711.     { OPTION_DISABLED             , VALUE_LIST    , 0                                          , PAGE_MESSAGES  , GD_DISABLED          , LISTVIEW_KIND , "-dontwarn=*"                 , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  712.     { OPTION_ANSI                 , VALUE_NUMBER  , OPTION_ANSI_NOANSI                         , PAGE_MESSAGES  , GD_ANSI              , CYCLE_KIND    , "-ansi"                       , OPTION_ANSI_ANSI                           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  713.     { OPTION_ISO                  , VALUE_NUMBER  , OPTION_ISO_NOISO                           , PAGE_MESSAGES  , GD_ISO               , CYCLE_KIND    , "-iso"                        , OPTION_ISO_ISO                             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  714.     { OPTION_MAXERRORS            , VALUE_NUMERIC , 0                                          , PAGE_MESSAGES  , GD_MAXERRORS         , STRING_KIND   , "-maxerrors=*"                , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  715.     { OPTION_HIDEPATH             , VALUE_NUMBER  , OPTION_HIDEPATH_FULLFILENAMES              , PAGE_MESSAGES  , GD_HIDEPATH          , CYCLE_KIND    , "-strip-path"                 , OPTION_HIDEPATH_HIDEPATHPART               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  716.  
  717.     // optimizer page
  718.  
  719.     { OPTION_ASSOZIATIVEFP        , VALUE_NUMBER  , OPTION_ASSOZIATIVEFP_NOASSOZIATIVEFP       , PAGE_OPTIMIZER , GD_ASSOZIATIVEFP     , CYCLE_KIND    , "-fp-assoziative"             , OPTION_ASSOZIATIVEFP_ASSOZIATIVEFP         , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  720.     { OPTION_INLINESIZE           , VALUE_NUMERIC , 0                                          , PAGE_OPTIMIZER , GD_INLINESIZE        , STRING_KIND   , "-inline-size=*"              , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  721.     { OPTION_OPTIMIZEALIAS        , VALUE_NUMBER  , OPTION_OPTIMIZEALIAS_OPTIMIZEALIAS         , PAGE_OPTIMIZER , GD_OPTIMIZEALIAS     , CYCLE_KIND    , "-no-alias-opt"               , OPTION_OPTIMIZEALIAS_NOOPTIMIZEALIAS       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  722.     { OPTION_OPTIMIZEINLINE       , VALUE_NUMBER  , OPTION_OPTIMIZEINLINE_OPTIMIZEINLINE       , PAGE_OPTIMIZER , GD_OPTIMIZEINLINE    , CYCLE_KIND    , "-no-inline-peephole"         , OPTION_OPTIMIZEINLINE_NOOPTIMIZEINLINE     , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  723.     { OPTION_OPTIMIZEPEEPHOLE     , VALUE_NUMBER  , OPTION_OPTIMIZEPEEPHOLE_OPTIMIZEPEEPHOLE   , PAGE_OPTIMIZER , GD_OPTIMIZEPEEPHOLE  , CYCLE_KIND    , "-no-peephole"                , OPTION_OPTIMIZEPEEPHOLE_NOOPTIMIZEPEEPHOLE , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  724.     { OPTION_OPTIMIZE             , VALUE_NUMBER  , OPTION_OPTIMIZE_NOOPTIMIZE                 , PAGE_OPTIMIZER , GD_OPTIMIZER         , CYCLE_KIND    , "-O"                          , OPTION_OPTIMIZE_OPTIMIZESOME               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  725.     { OPTION_OPTIMIZE             , VALUE_NUMBER  , OPTION_OPTIMIZE_NOOPTIMIZE                 , PAGE_OPTIMIZER , GD_OPTIMIZER         , CYCLE_KIND    , "-O0"                         , OPTION_OPTIMIZE_NOOPTIMIZE                 , RULE_DONOTSAVE  ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  726.     { OPTION_OPTIMIZE             , VALUE_NUMBER  , OPTION_OPTIMIZE_NOOPTIMIZE                 , PAGE_OPTIMIZER , GD_OPTIMIZER         , CYCLE_KIND    , "-O2"                         , OPTION_OPTIMIZE_OPTIMIZEMOST               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  727.     { OPTION_OPTIMIZE             , VALUE_NUMBER  , OPTION_OPTIMIZE_NOOPTIMIZE                 , PAGE_OPTIMIZER , GD_OPTIMIZER         , CYCLE_KIND    , "-O3"                         , OPTION_OPTIMIZE_OPTIMIZEALL                , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  728.     { OPTION_OPTIMIZE             , VALUE_NUMBER  , OPTION_OPTIMIZE_NOOPTIMIZE                 , PAGE_OPTIMIZER , GD_OPTIMIZER         , CYCLE_KIND    , "-O4"                         , OPTION_OPTIMIZE_OPTIMIZECROSSMODULE        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  729.     { OPTION_OPTIMIZE             , VALUE_NUMBER  , OPTION_OPTIMIZE_NOOPTIMIZE                 , PAGE_OPTIMIZER , GD_OPTIMIZER         , CYCLE_KIND    , "-O=0"                        , OPTION_OPTIMIZE_NOOPTIMIZE                 , RULE_DONOTSAVE  ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  730.     { OPTION_OPTIMIZESCHEDULE     , VALUE_NUMBER  , OPTION_OPTIMIZESCHEDULE_NOOPTIMIZESCHEDULE , PAGE_OPTIMIZER , GD_OPTIMIZESCHEDULE  , CYCLE_KIND    , "-schedule"                   , OPTION_OPTIMIZESCHEDULE_OPTIMIZESCHEDULE   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  731.     { OPTION_OPTIMIZESIZE         , VALUE_NUMBER  , OPTION_OPTIMIZESIZE_NOOPTIMIZESIZE         , PAGE_OPTIMIZER , GD_OPTIMIZESIZE      , CYCLE_KIND    , "-size"                       , OPTION_OPTIMIZESIZE_OPTIMIZESIZE           , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  732.     { OPTION_OPTIMIZESPEED        , VALUE_NUMBER  , OPTION_OPTIMIZESPEED_NOOPTIMIZESPEED       , PAGE_OPTIMIZER , GD_OPTIMIZESPEED     , CYCLE_KIND    , "-speed"                      , OPTION_OPTIMIZESPEED_OPTIMIZESPEED         , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  733.     { OPTION_UNROLLALL            , VALUE_NUMBER  , OPTION_UNROLLALL_NOUNROLLALL               , PAGE_OPTIMIZER , GD_UNROLLALL         , CYCLE_KIND    , "-unroll-all"                 , OPTION_UNROLLALL_UNROLLALL                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  734.     { OPTION_UNROLLSIZE           , VALUE_NUMERIC , 0                                          , PAGE_OPTIMIZER , GD_UNROLLSIZE        , STRING_KIND   , "-unroll-size=*"              , 0                                          , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  735.  
  736.     // ppc page
  737.  
  738.     { OPTION_MERGEFPCONST         , VALUE_NUMBER  , OPTION_MERGEFPCONST_NOMERGECONST           , PAGE_PPC       , GD_MERGEFPCONST      , CYCLE_KIND    , "-merge-constants"            , OPTION_MERGEFPCONST_MERGECONSTANTS         , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  739.     { OPTION_RODATA               , VALUE_NUMBER  , OPTION_RODATA_CONSTINRODATA                , PAGE_PPC       , GD_RODATA            , CYCLE_KIND    , "-const-in-data"              , OPTION_RODATA_CONSTINDATA                  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  740.     { OPTION_FSUBZERO             , VALUE_NUMBER  , OPTION_FSUBZERO_NOFSUBZERO                 , PAGE_PPC       , GD_FSUBZERO          , CYCLE_KIND    , "-fsub-zero"                  , OPTION_FSUBZERO_FSUBZERO                   , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  741.     { OPTION_AMIGAALIGN           , VALUE_NUMBER  , OPTION_AMIGAALIGN_NOAMIGAALIGN             , PAGE_PPC       , GD_AMIGAALIGN        , CYCLE_KIND    , "-amiga-align"                , OPTION_AMIGAALIGN_AMIGAALIGN               , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  742.     { OPTION_ELF                  , VALUE_NUMBER  , OPTION_ELF_NOELF                           , PAGE_PPC       , GD_ELF               , CYCLE_KIND    , "-elf"                        , OPTION_ELF_PREFIXELF                       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  743.     { OPTION_POWEROPEN            , VALUE_NUMBER  , OPTION_POWEROPEN_NOPOWEROPENABI            , PAGE_PPC       , GD_POWEROPEN         , CYCLE_KIND    , "-poweropen"                  , OPTION_POWEROPEN_POWEROPENABI              , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  744.     { OPTION_POWEROPEN            , VALUE_NUMBER  , OPTION_POWEROPEN_NOPOWEROPENABI            , PAGE_PPC       , GD_POWEROPEN         , CYCLE_KIND    , "-sc"                         , OPTION_POWEROPEN_POWEROPENABISTORMC        , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  745.     { OPTION_REGISTERNAMES        , VALUE_NUMBER  , OPTION_REGISTERNAMES_USEREGISTERNAMES      , PAGE_PPC       , GD_REGISTERNAMES     , CYCLE_KIND    , "-no-regnames"                , OPTION_REGISTERNAMES_NOREGISTERNAMES       , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  746.     { OPTION_SETCCS               , VALUE_NUMBER  , OPTION_SETCCS_NOCCSSIGNAL                  , PAGE_PPC       , GD_SETCCS            , CYCLE_KIND    , "-setccs"                     , OPTION_SETCCS_SETCCSSIGNAL                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  747.     { OPTION_LMW                  , VALUE_NUMBER  , OPTION_LMW_NOLMWSTMW                       , PAGE_PPC       , GD_LMW               , CYCLE_KIND    , "-use-lmw"                    , OPTION_LMW_USELMWSTMW                      , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  748.     { OPTION_FMADD                , VALUE_NUMBER  , OPTION_FMADD_NOFMADDFMSUB                  , PAGE_PPC       , GD_FMADD             , CYCLE_KIND    , "-madd"                       , OPTION_FMADD_USEFMADDFMSUB                 , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  749.     { OPTION_EMBEDDEDABI          , VALUE_NUMBER  , OPTION_EMBEDDEDABI_NOEMBEDDEDABI           , PAGE_PPC       , GD_EMBEDDEDABI       , CYCLE_KIND    , "-eabi"                       , OPTION_EMBEDDEDABI_EMBEDDEDABI             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  750.     { OPTION_ALIGNSTACK           , VALUE_NUMBER  , OPTION_ALIGNSTACK_ALIGNSTACK               , PAGE_PPC       , GD_ALIGNSTACK        , CYCLE_KIND    , "-no-align-args"              , OPTION_ALIGNSTACK_NOALIGNSTACK             , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  751.  
  752.     // OPTION_OPTIONS is last entry to catch unknown options ("*" template)
  753.  
  754.     { OPTION_OPTIONS              , VALUE_LIST    , 0                                          , PAGE_SPECIAL   , GD_OPTIONS           , LISTVIEW_KIND , "*"                           , UNDEFINED                                  , 0               ,   NULL ,    NULL ,      SYNTAX_ACTIVE   },
  755.  
  756.     OPTIONS_MAXIMUM
  757. };
  758.  
  759. /* ---------------------------------- PageLayout -------------------------------
  760.  
  761.  Layouts of dialog pages, in order of PAGE_ID
  762.  
  763. */
  764.  
  765. struct PageLayout Layouts[PAGE_MAXIMUM] =
  766. {
  767.     // gadgets count     gadget tags         gadget types        gadget data       textual labels
  768.  
  769.     { INDEX_CNT        , INDEXGTags       ,  INDEXGTypes       , INDEXNGad     ,   NULL           },
  770.     { COMPILER_CNT     , COMPILERGTags    ,  COMPILERGTypes    , COMPILERNGad  ,   NULL           },
  771.     { MESSAGES_CNT     , MESSAGESGTags    ,  MESSAGESGTypes    , MESSAGESNGad  ,   NULL           },
  772.     { CODE_CNT         , CODEGTags        ,  CODEGTypes        , CODENGad      ,   NULL           },
  773.     { OPTIMIZER_CNT    , OPTIMIZERGTags   ,  OPTIMIZERGTypes   , OPTIMIZERNGad ,   OPTIMIZERIText },
  774.     { LINKER_CNT       , LINKERGTags      ,  LINKERGTypes      , LINKERNGad    ,   NULL           },
  775.     { SPECIAL_CNT      , SPECIALGTags     ,  SPECIALGTypes     , SPECIALNGad   ,   NULL           },
  776.     { PPC_CNT          , PPCGTags         ,  PPCGTypes         , PPCNGad       ,   NULL           }
  777. };
  778.  
  779. #endif
  780.  
  781. ///
  782. /// "main"
  783.  
  784. /* ----------------------------------- main ------------------------------------
  785.  
  786.  CLI entry point
  787.  
  788. */
  789.  
  790. int
  791. main(int argc, char **argv)
  792. {
  793.     NewList(&Config.Windows);
  794.  
  795.     if (GadToolsBase->lib_Version >= 39)
  796.     {
  797.         STATIC UBYTE template[] = "FILE/K,PUBSCREEN/K,EDIT/S";
  798.  
  799.         struct RDArgs *rdArgs;
  800.         LONG           argArray[3];
  801.  
  802.         memset(argArray, 0, sizeof(argArray));
  803.  
  804.         // parse startup arguments
  805.  
  806.         if (rdArgs = ReadArgs(template, argArray, NULL))
  807.         {
  808.             UBYTE *file;
  809.             UBYTE *pubscreen;
  810.             BOOL   edit;
  811.  
  812.             file      = (UBYTE *)argArray[0];
  813.             pubscreen = (UBYTE *)argArray[1];
  814.             edit      = (BOOL   )argArray[2];
  815.  
  816.             if ((pubscreen == NULL) || (*pubscreen == 0))
  817.  
  818.                 pubscreen = "Workbench";
  819.  
  820.             strncpy(Config.Pubscreen, pubscreen, MAX_SCREEN);
  821.  
  822.             if ((file == NULL) || (*file == 0))
  823.  
  824.                 file = OPTIONS;
  825.  
  826.             strncpy(Config.File, file, MAX_PATHLEN);
  827.  
  828.             // load configuration
  829.  
  830.             InitOptions(&Config.Options);
  831.  
  832.             LoadOptions(&Config.Options, file, LOADMODE_MERGE, FALSE);
  833.  
  834.             // open user interface ?
  835.  
  836.             if (edit)
  837.             {
  838.                 struct WindowSupportInfo *info;
  839.  
  840.                 if (info = ShowUserInterface())
  841.                 {
  842.                     info->Options = &Config.Options;
  843.  
  844.                     if (ShowPage(info, PAGE_INDEX))
  845.                     {
  846.                         WindowLoop(info);
  847.                     }
  848.  
  849.                     CloseUserInterface();
  850.                 }
  851.             }
  852.             else
  853.                 SaveOptions(&Config.Options, "*");
  854.  
  855.             // clean up
  856.  
  857.             FreeOptions(&Config.Options);
  858.  
  859.             FreeArgs(rdArgs);
  860.  
  861.             return(0);
  862.         }
  863.     }
  864.     else
  865.         Warn("gadtools.library 39.0 required !", NULL);
  866.  
  867.     return(20);
  868. }
  869.  
  870. ///
  871. /// "loop"
  872.  
  873. /* --------------------------------- WindowLoop --------------------------------
  874.  
  875.  Event-processing loop
  876.  
  877. */
  878.  
  879. void
  880. WindowLoop(struct WindowSupportInfo *info)
  881. {
  882.     struct Window *win = info->Window;
  883.  
  884.     while (win)
  885.     {
  886.         struct IntuiMessage *msg;
  887.  
  888.         WaitPort(win->UserPort);
  889.  
  890.         while (msg = GT_GetIMsg(win->UserPort))
  891.         {
  892.             struct IntuiMessage imsg = *msg;
  893.  
  894.             // convert message from boopsi gadget to IDCMP_GADGETUP
  895.  
  896.             if (msg->Class == IDCMP_IDCMPUPDATE)
  897.             {
  898.                 struct TagItem *tag;
  899.  
  900.                 for (tag = (struct TagItem *)msg->IAddress; tag->ti_Tag; ++tag)
  901.                 {
  902.                     switch (tag->ti_Tag) {
  903.  
  904.                         case BOOPSI_ATTRIB_ADDRESS:
  905.  
  906.                             imsg.IAddress = (struct Gadget *)tag->ti_Data;
  907.  
  908.                             imsg.Class = IDCMP_GADGETUP;
  909.  
  910.                             break;
  911.  
  912.                         case GTCY_Active:
  913.  
  914.                             imsg.Code = (ULONG)tag->ti_Data;
  915.  
  916.                             break;
  917.                     }
  918.                 }
  919.             }
  920.  
  921.             GT_ReplyIMsg(msg);
  922.  
  923.             switch (imsg.Class)
  924.             {
  925.                 case IDCMP_MENUPICK:
  926.  
  927.                     {
  928.                         UWORD item = ITEMNUM(imsg.Code);
  929.  
  930.                         switch (item)
  931.                         {
  932.                             case MENU_RESET:
  933.                             case MENU_RESETPAGE:
  934.  
  935.                                 DetachGadgets(info, TRUE);
  936.  
  937.                                 if (item == MENU_RESETPAGE)
  938.                                     ResetOptions(&Config.Options, info->Page);
  939.                                 else
  940.                                     ResetOptions(&Config.Options, UNDEFINED);
  941.  
  942.                                 ShowPage(info, info->Page);
  943.  
  944.                                 break;
  945.  
  946.                             case MENU_ABOUT:
  947.  
  948.                                 Warn("Author: Dietmar Eilert (mail@dietmar-eilert.de)", NULL);
  949.  
  950.                                 break;
  951.                         }
  952.                     }
  953.  
  954.                     break;
  955.  
  956.                 case IDCMP_GADGETUP:
  957.  
  958.                     {
  959.                         struct Gadget *gadget = (struct Gadget *)imsg.IAddress;
  960.  
  961.                         // process click
  962.  
  963.                         switch (info->Page)
  964.                         {
  965.                             case PAGE_INDEX:
  966.  
  967.                                 switch (gadget->GadgetID)
  968.                                 {
  969.                                     case GD_CANCEL:
  970.  
  971.                                         CloseWindowSafely(info);
  972.  
  973.                                         return;
  974.  
  975.                                     case GD_SAVE:
  976.  
  977.                                         if (info->Options)
  978.                                         {
  979.                                             ReadPage(info);
  980.  
  981.                                             if (SaveOptions(info->Options, Config.File))
  982.                                             {
  983.                                                 CloseWindowSafely(info);
  984.  
  985.                                                 return;
  986.                                             }
  987.                                         }
  988.  
  989.                                         break;
  990.  
  991.                                     case GD_SAVEDEFAULT:
  992.  
  993.                                         if (info->Options)
  994.                                         {
  995.                                             ReadPage(info);
  996.  
  997.                                             SaveOptions(info->Options, "env:" OPTIONS);
  998.  
  999.                                             SaveOptions(info->Options, "envarc:" OPTIONS);
  1000.                                         }
  1001.  
  1002.                                         break;
  1003.  
  1004.                                     case GD_LINKEROPTIONS:
  1005.  
  1006.                                         ShowPage(info, PAGE_LINKER);
  1007.  
  1008.                                         break;
  1009.  
  1010.                                     case GD_OPTIMIZEROPTIONS:
  1011.  
  1012.                                         ShowPage(info, PAGE_OPTIMIZER);
  1013.  
  1014.                                         break;
  1015.  
  1016.                                     case GD_COMPILEROPTIONS:
  1017.  
  1018.                                         ShowPage(info, PAGE_COMPILER);
  1019.  
  1020.                                         break;
  1021.  
  1022.                                     case GD_MESSAGEOPTIONS:
  1023.  
  1024.                                         ShowPage(info, PAGE_MESSAGES);
  1025.  
  1026.                                         break;
  1027.  
  1028.                                     case GD_OTHEROPTIONS:
  1029.  
  1030.                                         ShowPage(info, PAGE_SPECIAL);
  1031.  
  1032.                                         break;
  1033.  
  1034.                                     #ifdef TARGET_GCC
  1035.  
  1036.                                     case GD_LANGUAGEOPTIONS:
  1037.  
  1038.                                         ShowPage(info, PAGE_LANGUAGE);
  1039.  
  1040.                                         break;
  1041.  
  1042.                                     case GD_PREPROCESSOROPTIONS:
  1043.  
  1044.                                         ShowPage(info, PAGE_PREPROCESSOR);
  1045.  
  1046.                                         break;
  1047.  
  1048.                                     case GD_DEBUGGEROPTIONS:
  1049.  
  1050.                                         ShowPage(info, PAGE_DEBUGGER);
  1051.  
  1052.                                         break;
  1053.  
  1054.                                     case GD_M68KOPTIONS:
  1055.  
  1056.                                         ShowPage(info, PAGE_M68K);
  1057.  
  1058.                                         break;
  1059.  
  1060.                                     case GD_INLINEOPTIONS:
  1061.  
  1062.                                         ShowPage(info, PAGE_INLINE);
  1063.  
  1064.                                         break;
  1065.  
  1066.                                     #endif
  1067.  
  1068.                                     #ifdef TARGET_VBCC
  1069.  
  1070.                                     case GD_CODEOPTIONS:
  1071.  
  1072.                                         ShowPage(info, PAGE_CODE);
  1073.  
  1074.                                         break;
  1075.  
  1076.                                     case GD_PPCOPTIONS:
  1077.  
  1078.                                         ShowPage(info, PAGE_PPC);
  1079.  
  1080.                                         break;
  1081.  
  1082.                                     #endif
  1083.  
  1084.                                     default:
  1085.  
  1086.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1087.                                 }
  1088.  
  1089.                                 break;
  1090.  
  1091.                             case PAGE_COMPILER:
  1092.  
  1093.                                 switch (gadget->GadgetID)
  1094.                                 {
  1095.                                     case GD_OKCOMPILER:
  1096.  
  1097.                                         ShowPage(info, PAGE_INDEX);
  1098.  
  1099.                                         break;
  1100.  
  1101.                                     default:
  1102.  
  1103.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1104.                                 }
  1105.  
  1106.                                 break;
  1107.  
  1108.                             case PAGE_MESSAGES:
  1109.  
  1110.                                 switch (gadget->GadgetID)
  1111.                                 {
  1112.                                     case GD_OKMESSAGES:
  1113.  
  1114.                                         ShowPage(info, PAGE_INDEX);
  1115.  
  1116.                                         break;
  1117.  
  1118.                                     default:
  1119.  
  1120.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1121.                                 }
  1122.  
  1123.                                 break;
  1124.  
  1125.                             case PAGE_OPTIMIZER:
  1126.  
  1127.                                 switch (gadget->GadgetID)
  1128.                                 {
  1129.                                     case GD_OKOPTIMIZER:
  1130.  
  1131.                                         ShowPage(info, PAGE_INDEX);
  1132.  
  1133.                                         break;
  1134.  
  1135.                                     #ifdef TARGET_GCC
  1136.  
  1137.                                     case GD_DETAILS:
  1138.  
  1139.                                         ShowPage(info, PAGE_DETAILS);
  1140.  
  1141.                                         break;
  1142.  
  1143.                                     #endif
  1144.  
  1145.                                     default:
  1146.  
  1147.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1148.                                 }
  1149.  
  1150.                                 break;
  1151.  
  1152.                             case PAGE_LINKER:
  1153.  
  1154.                                 switch (gadget->GadgetID)
  1155.                                 {
  1156.                                     case GD_OKLINKER:
  1157.  
  1158.                                         ShowPage(info, PAGE_INDEX);
  1159.  
  1160.                                         break;
  1161.  
  1162.                                     default:
  1163.  
  1164.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1165.                                 }
  1166.  
  1167.                                 break;
  1168.  
  1169.                             case PAGE_SPECIAL:
  1170.  
  1171.                                 switch (gadget->GadgetID)
  1172.                                 {
  1173.                                     case GD_OKSPECIAL:
  1174.  
  1175.                                         ShowPage(info, PAGE_INDEX);
  1176.  
  1177.                                         break;
  1178.  
  1179.                                     default:
  1180.  
  1181.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1182.                                 }
  1183.  
  1184.                                 break;
  1185.  
  1186.                             #ifdef TARGET_GCC
  1187.  
  1188.                             case PAGE_LANGUAGE:
  1189.  
  1190.                                 switch (gadget->GadgetID)
  1191.                                 {
  1192.                                     case GD_CPLUSPLUSOPTIONS:
  1193.  
  1194.                                         ShowPage(info, PAGE_CPLUSPLUS);
  1195.  
  1196.                                         break;
  1197.  
  1198.                                     case GD_OKLANGUAGE:
  1199.  
  1200.                                         ShowPage(info, PAGE_INDEX);
  1201.  
  1202.                                         break;
  1203.  
  1204.                                     default:
  1205.  
  1206.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1207.  
  1208.                                         break;
  1209.                                 }
  1210.  
  1211.                                 break;
  1212.  
  1213.                             case PAGE_PREPROCESSOR:
  1214.  
  1215.                                 switch (gadget->GadgetID)
  1216.                                 {
  1217.                                     case GD_OKPREPROCESSOR:
  1218.  
  1219.                                         ShowPage(info, PAGE_INDEX);
  1220.  
  1221.                                         break;
  1222.  
  1223.                                     default:
  1224.  
  1225.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1226.  
  1227.                                         break;
  1228.                                 }
  1229.  
  1230.                                 break;
  1231.  
  1232.                             case PAGE_CPLUSPLUS:
  1233.  
  1234.                                 switch (gadget->GadgetID)
  1235.                                 {
  1236.                                     case GD_OKCPLUSPLUS:
  1237.  
  1238.                                         ShowPage(info, PAGE_LANGUAGE);
  1239.  
  1240.                                         break;
  1241.  
  1242.                                     default:
  1243.  
  1244.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1245.  
  1246.                                         break;
  1247.                                 }
  1248.  
  1249.                                 break;
  1250.  
  1251.                             case PAGE_DETAILS:
  1252.  
  1253.                                 switch (gadget->GadgetID)
  1254.                                 {
  1255.                                     case GD_OKDETAILS:
  1256.  
  1257.                                         ShowPage(info, PAGE_OPTIMIZER);
  1258.  
  1259.                                         break;
  1260.  
  1261.                                     default:
  1262.  
  1263.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1264.                                 }
  1265.  
  1266.                                 break;
  1267.  
  1268.                             case PAGE_INLINE:
  1269.  
  1270.                                 switch (gadget->GadgetID)
  1271.                                 {
  1272.                                     case GD_OKINLINE:
  1273.  
  1274.                                         ShowPage(info, PAGE_INDEX);
  1275.  
  1276.                                         break;
  1277.  
  1278.                                     default:
  1279.  
  1280.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1281.                                 }
  1282.  
  1283.                                 break;
  1284.  
  1285.                             case PAGE_PPC:
  1286.  
  1287.                                 switch (gadget->GadgetID)
  1288.                                 {
  1289.                                     case GD_OKPPC:
  1290.  
  1291.                                         ShowPage(info, PAGE_M68K);
  1292.  
  1293.                                         break;
  1294.  
  1295.                                     default:
  1296.  
  1297.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1298.                                 }
  1299.  
  1300.                                 break;
  1301.  
  1302.                             case PAGE_M68K:
  1303.  
  1304.                                 switch (gadget->GadgetID)
  1305.                                 {
  1306.                                     case GD_OKM68K:
  1307.  
  1308.                                         ShowPage(info, PAGE_INDEX);
  1309.  
  1310.                                         break;
  1311.  
  1312.                                     case GD_PPC:
  1313.  
  1314.                                         ShowPage(info, PAGE_PPC);
  1315.  
  1316.                                         break;
  1317.  
  1318.                                     default:
  1319.  
  1320.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1321.                                 }
  1322.  
  1323.                                 break;
  1324.  
  1325.                             case PAGE_DEBUGGER:
  1326.  
  1327.                                 switch (gadget->GadgetID)
  1328.                                 {
  1329.                                     case GD_OKDEBUGGER:
  1330.  
  1331.                                         ShowPage(info, PAGE_INDEX);
  1332.  
  1333.                                         break;
  1334.  
  1335.                                     default:
  1336.  
  1337.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1338.                                 }
  1339.  
  1340.                                 break;
  1341.  
  1342.                             #endif
  1343.  
  1344.                             #ifdef TARGET_VBCC
  1345.  
  1346.                             case PAGE_CODE:
  1347.  
  1348.                                 switch (gadget->GadgetID)
  1349.                                 {
  1350.                                     case GD_OKCODE:
  1351.  
  1352.                                         ShowPage(info, PAGE_INDEX);
  1353.  
  1354.                                         break;
  1355.  
  1356.                                     default:
  1357.  
  1358.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1359.                                 }
  1360.  
  1361.                                 break;
  1362.  
  1363.                             case PAGE_PPC:
  1364.  
  1365.                                 switch (gadget->GadgetID)
  1366.                                 {
  1367.                                     case GD_OKPPC:
  1368.  
  1369.                                         ShowPage(info, PAGE_INDEX);
  1370.  
  1371.                                         break;
  1372.  
  1373.                                     default:
  1374.  
  1375.                                         DefaultGadgetHandler(info, gadget->GadgetID);
  1376.                                 }
  1377.  
  1378.                                 break;
  1379.  
  1380.                             #endif
  1381.                         }
  1382.                     }
  1383.  
  1384.                     break;
  1385.  
  1386.                 case IDCMP_REFRESHWINDOW:
  1387.  
  1388.                     BeginRefresh(win);
  1389.  
  1390.                     EndRefresh(win, TRUE);
  1391.  
  1392.                     break;
  1393.  
  1394.                 default:
  1395.  
  1396.                     break;
  1397.             }
  1398.         }
  1399.     }
  1400. }
  1401.  
  1402. ///
  1403. /// "syntax"
  1404.  
  1405. /* --------------------------------- InitSyntax --------------------------------
  1406.  
  1407.  Reset state of syntax rules (some command line options are not available until
  1408.  an "activation option" enables it).
  1409.  
  1410. */
  1411.  
  1412. void
  1413. InitSyntax()
  1414. {
  1415.     struct Syntax *syntax;
  1416.  
  1417.     for (syntax = Syntax; syntax->ID < OPTIONS_MAXIMUM; ++syntax)
  1418.     {
  1419.         syntax->Status = (syntax->Enable) ? SYNTAX_INACTIVE : SYNTAX_ACTIVE;
  1420.     }
  1421. }
  1422.  
  1423. ///
  1424. /// "options"
  1425.  
  1426. /* -------------------------------- InitOptions --------------------------------
  1427.  
  1428.  Prepare <options> for use
  1429.  
  1430. */
  1431.  
  1432. void
  1433. InitOptions(struct Options *options)
  1434. {
  1435.     UWORD ID;
  1436.  
  1437.     // loop through all options
  1438.  
  1439.     for (ID = 0; ID < OPTIONS_MAXIMUM; ++ID)
  1440.     {
  1441.         struct Syntax *syntax;
  1442.  
  1443.         // find rule in syntax table
  1444.  
  1445.         for (syntax = Syntax; syntax->ID < OPTIONS_MAXIMUM; ++syntax)
  1446.         {
  1447.             if (syntax->ID == ID)
  1448.             {
  1449.                 struct Value *value = &options->Values[ID];
  1450.  
  1451.                 value->Type = syntax->Type;
  1452.  
  1453.                 switch (syntax->Type)
  1454.                 {
  1455.                     case VALUE_NUMBER:
  1456.  
  1457.                         // set default value
  1458.  
  1459.                         value->Number = syntax->Value;
  1460.  
  1461.                         break;
  1462.  
  1463.                     case VALUE_LIST:
  1464.  
  1465.                         NewList(&value->List);
  1466.  
  1467.                         break;
  1468.                 }
  1469.  
  1470.                 break;
  1471.             }
  1472.         }
  1473.  
  1474.         if (syntax->ID == OPTIONS_MAXIMUM)
  1475.         {
  1476.             Warn(Assert, (APTR)__LINE__);
  1477.         }
  1478.     }
  1479. }
  1480.  
  1481. /* -------------------------------- FreeOptions --------------------------------
  1482.  
  1483.  Free memory allocated for <options>
  1484.  
  1485. */
  1486.  
  1487. void
  1488. FreeOptions(struct Options *options)
  1489. {
  1490.     UWORD ID;
  1491.  
  1492.     for (ID = 0; ID < OPTIONS_MAXIMUM; ++ID)
  1493.     {
  1494.         FreeValue(&options->Values[ID]);
  1495.     }
  1496. }
  1497.  
  1498. /* --------------------------------- ResetOptions ---------------------------------
  1499.  
  1500.  Reset options associated with <page> (or all options if <page> is UNDEFINED).
  1501.  
  1502. */
  1503.  
  1504. void
  1505. ResetOptions(struct Options *options, UWORD page)
  1506. {
  1507.     if (page == UNDEFINED)
  1508.     {
  1509.         FreeOptions(&Config.Options);
  1510.  
  1511.         InitOptions(&Config.Options);
  1512.     }
  1513.     else
  1514.     {
  1515.         // loop through all options
  1516.  
  1517.         UWORD ID;
  1518.  
  1519.         for (ID = 0; ID < OPTIONS_MAXIMUM; ++ID)
  1520.         {
  1521.             struct Syntax *syntax;
  1522.  
  1523.             // scan syntax table and decide if option is displayed on <page>
  1524.  
  1525.             for (syntax = Syntax; syntax->ID < OPTIONS_MAXIMUM; ++syntax)
  1526.             {
  1527.                 if ((syntax->ID == ID) && (syntax->Page == page))
  1528.                 {
  1529.                     FreeValue(&options->Values[ID]);
  1530.                 }
  1531.             }
  1532.         }
  1533.     }
  1534. }
  1535.  
  1536. /* -------------------------------- SaveOptions --------------------------------
  1537.  
  1538.  Save options to file (or to stdout if <file> is "*")
  1539.  
  1540. */
  1541.  
  1542. BOOL
  1543. SaveOptions(struct Options *options, UBYTE *file)
  1544. {
  1545.     UBYTE *buffer;
  1546.     LONG   error;
  1547.  
  1548.     error = 0;
  1549.  
  1550.     // allocate buffer for one line
  1551.  
  1552.     if (buffer = (UBYTE *)AllocVec(MAX_NAME + 1 + MAX_PATHLEN + 1, MEMF_ANY))
  1553.     {
  1554.         UWORD separator;
  1555.         BOOL  console;
  1556.         BPTR  handle;
  1557.  
  1558.         // print to stdout ?
  1559.  
  1560.         if (console = (*file == '*'))
  1561.         {
  1562.             handle = Output();
  1563.  
  1564.             separator = ' ';
  1565.         }
  1566.         else
  1567.         {
  1568.             handle = Open(file, MODE_NEWFILE);
  1569.  
  1570.             separator = '\n';
  1571.         }
  1572.  
  1573.         if (handle)
  1574.         {
  1575.             struct Syntax *syntax;
  1576.             BOOL           save[OPTIONS_MAXIMUM];
  1577.  
  1578.             memset(save, TRUE, sizeof(save));
  1579.  
  1580.             // loop through all rules in syntax table
  1581.  
  1582.             for (syntax = Syntax; (syntax->ID < OPTIONS_MAXIMUM) && (error == 0); ++syntax)
  1583.             {
  1584.                 // does rule contain enough information to be used for saving ?
  1585.  
  1586.                 if (syntax->Template && ((syntax->Flags & RULE_DONOTSAVE) == 0))
  1587.                 {
  1588.                     UWORD ID = syntax->ID;
  1589.  
  1590.                     // option associated with this rule no yet saved ?
  1591.  
  1592.                     if (save[ID])
  1593.                     {
  1594.                         // get (and validate) type of option
  1595.  
  1596.                         struct Value *value = &options->Values[ID];
  1597.  
  1598.                         if (value->Type == syntax->Type)
  1599.                         {
  1600.                             UBYTE *fillin;
  1601.  
  1602.                             strcpy(buffer, syntax->Template);
  1603.  
  1604.                             if (fillin = strrchr(buffer, '*'))
  1605.                             {
  1606.                                 // syntax rule for option with argument; save option
  1607.  
  1608.                                 switch (value->Type)
  1609.                                 {
  1610.                                     case VALUE_NUMERIC:
  1611.                                     case VALUE_STRING:
  1612.  
  1613.                                         if (value->String && *value->String)
  1614.                                         {
  1615.                                             strcpy(fillin, value->String);
  1616.  
  1617.                                             // enabling sequence required ?
  1618.  
  1619.                                             if (syntax->Enable)
  1620.                                             {
  1621.                                                 if (FPuts(handle, syntax->Enable) || (FPutC(handle, separator) != separator))
  1622.                                                 {
  1623.                                                     error = TRUE;
  1624.                                                 }
  1625.                                             }
  1626.  
  1627.                                             if (FPuts(handle, buffer) || (FPutC(handle, separator) != separator))
  1628.                                             {
  1629.                                                 error = TRUE;
  1630.                                             }
  1631.                                             else
  1632.                                                 save[ID] = FALSE;
  1633.                                         }
  1634.  
  1635.                                         break;
  1636.  
  1637.                                     case VALUE_NUMBER:
  1638.  
  1639.                                         // enabling sequence required ?
  1640.  
  1641.                                         if (syntax->Enable)
  1642.                                         {
  1643.                                             if (FPuts(handle, syntax->Enable) || (FPutC(handle, separator) != separator))
  1644.                                             {
  1645.                                                 error = TRUE;
  1646.                                             }
  1647.                                         }
  1648.  
  1649.                                         sprintf(fillin, "%d", value->Number);
  1650.  
  1651.                                         if (FPuts(handle, buffer) || (FPutC(handle, separator) != separator))
  1652.                                         {
  1653.                                             error = TRUE;
  1654.                                         }
  1655.                                         else
  1656.                                             save[ID] = FALSE;
  1657.  
  1658.                                         break;
  1659.  
  1660.                                     case VALUE_LIST:
  1661.  
  1662.                                         if (value->List.lh_Head->ln_Succ)
  1663.                                         {
  1664.                                             struct Node *node;
  1665.  
  1666.                                             // enabling sequence required ?
  1667.  
  1668.                                             if (syntax->Enable)
  1669.                                             {
  1670.                                                 if (FPuts(handle, syntax->Enable) || (FPutC(handle, separator) != separator))
  1671.                                                 {
  1672.                                                     error = TRUE;
  1673.                                                 }
  1674.                                             }
  1675.  
  1676.                                             for (node = value->List.lh_Head; node && node->ln_Succ; node = node->ln_Succ)
  1677.                                             {
  1678.                                                 if (node->ln_Name)
  1679.                                                     strcpy(fillin, node->ln_Name);
  1680.                                                 else
  1681.                                                     *fillin = 0;
  1682.  
  1683.                                                 if (FPuts(handle, buffer) || (FPutC(handle, separator) != separator))
  1684.                                                 {
  1685.                                                     error = TRUE;
  1686.  
  1687.                                                     break;
  1688.                                                 }
  1689.                                                 else
  1690.                                                     save[ID] = FALSE;
  1691.                                             }
  1692.                                         }
  1693.  
  1694.                                         break;
  1695.                                 }
  1696.                             }
  1697.                             else
  1698.                             {
  1699.                                 // syntax rule for option without argument; save option
  1700.  
  1701.                                 switch (syntax->Type)
  1702.                                 {
  1703.                                     case VALUE_NUMBER:
  1704.  
  1705.                                         // does syntax rule apply to current value of option ?
  1706.  
  1707.                                         if (value->Number == syntax->TemplateValue)
  1708.                                         {
  1709.                                             // enabling sequence required ?
  1710.  
  1711.                                             if (syntax->Enable)
  1712.                                             {
  1713.                                                 if (FPuts(handle, syntax->Enable) || (FPutC(handle, separator) != separator))
  1714.                                                 {
  1715.                                                     error = TRUE;
  1716.                                                 }
  1717.                                             }
  1718.  
  1719.                                             if (FPuts(handle, syntax->Template) || (FPutC(handle, separator) != separator))
  1720.                                             {
  1721.                                                 error = TRUE;
  1722.  
  1723.                                                 break;
  1724.                                             }
  1725.                                             else
  1726.                                                 save[ID] = FALSE;
  1727.                                         }
  1728.                                 }
  1729.                             }
  1730.                         }
  1731.                         else
  1732.                             Warn(Assert, (APTR)__LINE__);
  1733.                     }
  1734.                 }
  1735.             }
  1736.  
  1737.             if (error)
  1738.  
  1739.                 Warn("Write error while saving to <%s> !", file);
  1740.  
  1741.             if (!console)
  1742.  
  1743.                 Close(handle);
  1744.         }
  1745.         else
  1746.             Warn("Can not open <%s> (for writing !)", file);
  1747.  
  1748.         FreeVec(buffer);
  1749.     }
  1750.  
  1751.     if (error == 0)
  1752.  
  1753.         return(TRUE);
  1754.  
  1755.     return(FALSE);
  1756. }
  1757.  
  1758. /* --------------------------------- SetOption ---------------------------------
  1759.  
  1760.  Set option indentified by <ID> to <optionvalue> (string or number)
  1761.  
  1762. */
  1763.  
  1764. void
  1765. SetOption(struct Options *options, UWORD ID, APTR optionvalue)
  1766. {
  1767.     struct Syntax *syntax;
  1768.  
  1769.     for (syntax = Syntax; syntax->ID < OPTIONS_MAXIMUM; ++syntax)
  1770.     {
  1771.         if (syntax->ID == ID)
  1772.         {
  1773.             struct Value *value = &options->Values[syntax->ID];
  1774.  
  1775.             switch (value->Type)
  1776.             {
  1777.                 case VALUE_NUMBER:
  1778.  
  1779.                     SetValueNumber(value, (UWORD)optionvalue);
  1780.  
  1781.                     break;
  1782.  
  1783.                 case VALUE_NUMERIC:
  1784.                 case VALUE_STRING:
  1785.  
  1786.                     SetValueString(value, (UBYTE *)optionvalue);
  1787.  
  1788.                     break;
  1789.  
  1790.                 default:
  1791.  
  1792.                     Warn(Assert, (APTR)__LINE__);
  1793.             }
  1794.  
  1795.             break;
  1796.         }
  1797.     }
  1798. }
  1799.  
  1800. /* -------------------------------- LoadOptions --------------------------------
  1801.  
  1802.  Load options from file
  1803.  
  1804. */
  1805.  
  1806. BOOL
  1807. LoadOptions(struct Options *options, UBYTE *file, UWORD mode, BOOL warn)
  1808. {
  1809.     UBYTE *buffer;
  1810.     LONG   error;
  1811.  
  1812.     error = 0;
  1813.  
  1814.     // allocate buffer for one line
  1815.  
  1816.     if (buffer = (UBYTE *)AllocVec(MAX_NAME + 1 + MAX_PATHLEN + 1, MEMF_ANY))
  1817.     {
  1818.         BPTR handle;
  1819.  
  1820.         if (handle = Open(file, MODE_OLDFILE))
  1821.         {
  1822.             // reset syngtax (some syntax options are not available until enabled)
  1823.  
  1824.             InitSyntax();
  1825.  
  1826.             while (FGets(handle, buffer, MAX_NAME + 1 + MAX_PATHLEN + 1))
  1827.             {
  1828.                 UBYTE *eol;
  1829.  
  1830.                 // remove linefeed and/or CR
  1831.  
  1832.                 if (eol = strchr(buffer, 10))
  1833.  
  1834.                     *eol = 0;
  1835.  
  1836.                 if (eol = strchr(buffer, 13))
  1837.  
  1838.                     *eol = 0;
  1839.  
  1840.                 if (*buffer)
  1841.                 {
  1842.                     struct Syntax *syntax;
  1843.                     BOOL           parsed;
  1844.  
  1845.                     // loop through all enabling/disabling sequences
  1846.  
  1847.                     parsed = FALSE;
  1848.  
  1849.                     for (syntax = Syntax; syntax->ID < OPTIONS_MAXIMUM; ++syntax)
  1850.                     {
  1851.                         if (syntax->Enable && (strcmp(buffer, syntax->Enable) == 0))
  1852.                         {
  1853.                             syntax->Status = SYNTAX_ACTIVE;
  1854.  
  1855.                             parsed = TRUE;
  1856.                         }
  1857.  
  1858.                         if (syntax->Disable && (strcmp(buffer, syntax->Disable) == 0))
  1859.                         {
  1860.                             syntax->Status = SYNTAX_INACTIVE;
  1861.  
  1862.                             parsed = TRUE;
  1863.                         }
  1864.                     }
  1865.  
  1866.                     // loop through all rules in syntax table
  1867.  
  1868.                     if (parsed == FALSE)
  1869.                     {
  1870.                         for (syntax = Syntax; (syntax->ID < OPTIONS_MAXIMUM) && (error == 0); ++syntax)
  1871.                         {
  1872.                             if (syntax->Status != SYNTAX_INACTIVE)
  1873.                             {
  1874.                                 UBYTE *template;
  1875.  
  1876.                                 // does rule contain enough information to be used for parsing ?
  1877.  
  1878.                                 if (template = syntax->Template)
  1879.                                 {
  1880.                                     UBYTE *next;
  1881.                                     BOOL   match;
  1882.  
  1883.                                     // does rule's template match line in file ?
  1884.  
  1885.                                     match = TRUE;
  1886.  
  1887.                                     for (next = buffer; *template != '*'; ++next, ++template)
  1888.                                     {
  1889.                                         if (*next != *template)
  1890.                                         {
  1891.                                             match = FALSE;
  1892.  
  1893.                                             break;
  1894.                                         }
  1895.                                         else if (*template == 0)
  1896.  
  1897.                                             break;
  1898.                                     }
  1899.  
  1900.                                     if (match)
  1901.                                     {
  1902.                                         // get (and validate) type of option
  1903.  
  1904.                                         struct Value *value = &options->Values[syntax->ID];
  1905.  
  1906.                                         if (syntax->Type == value->Type)
  1907.                                         {
  1908.                                             switch (value->Type)
  1909.                                             {
  1910.                                                 case VALUE_NUMBER:
  1911.  
  1912.                                                     SetValueNumber(value, syntax->TemplateValue);
  1913.  
  1914.                                                     break;
  1915.  
  1916.                                                 case VALUE_LIST:
  1917.  
  1918.                                                     {
  1919.                                                         struct Node *node;
  1920.                                                         UBYTE       *fillin;
  1921.                                                         UBYTE       *name;
  1922.  
  1923.                                                         // skip over option name to argument
  1924.  
  1925.                                                         name = buffer;
  1926.  
  1927.                                                         if (fillin = strchr(syntax->Template, '*'))
  1928.  
  1929.                                                             name += (fillin - syntax->Template);
  1930.  
  1931.                                                         while (*name == ' ')
  1932.  
  1933.                                                             ++name;
  1934.  
  1935.                                                         // remove existing conflicting entries ?
  1936.  
  1937.                                                         if (mode == LOADMODE_REPLACE)
  1938.  
  1939.                                                             FreeDupes(&value->List, name);
  1940.  
  1941.                                                         // add argument to list
  1942.  
  1943.                                                         if (node = CreateNode(name))
  1944.  
  1945.                                                             AddTail(&value->List, node);
  1946.                                                     }
  1947.  
  1948.                                                     break;
  1949.  
  1950.                                                 case VALUE_NUMERIC:
  1951.                                                 case VALUE_STRING:
  1952.  
  1953.                                                     {
  1954.                                                         // skip over option name to argument
  1955.  
  1956.                                                         UBYTE *name;
  1957.                                                         UBYTE *fillin;
  1958.  
  1959.                                                         name = buffer;
  1960.  
  1961.                                                         if (fillin = strchr(syntax->Template, '*'))
  1962.  
  1963.                                                             name += (fillin - syntax->Template);
  1964.  
  1965.                                                         while (*name == ' ')
  1966.  
  1967.                                                             ++name;
  1968.  
  1969.                                                         SetValueString(value, name);
  1970.                                                     }
  1971.  
  1972.                                                     break;
  1973.                                             }
  1974.                                         }
  1975.                                         else
  1976.                                             Warn(Assert, (APTR)__LINE__);
  1977.  
  1978.                                         // line has been parsed
  1979.  
  1980.                                         break;
  1981.                                     }
  1982.                                 }
  1983.                             }
  1984.                         }
  1985.                     }
  1986.                 }
  1987.             }
  1988.  
  1989.             if (error == 0)
  1990.  
  1991.                 error = IoErr();
  1992.  
  1993.             if (error)
  1994.  
  1995.                 Warn("Write error while reading from <%s> !", file);
  1996.  
  1997.             Close(handle);
  1998.         }
  1999.         else if (warn)
  2000.  
  2001.             Warn("Can not open <%s> (for reading) !", file);
  2002.  
  2003.         FreeVec(buffer);
  2004.     }
  2005.  
  2006.     if (error)
  2007.         return(FALSE);
  2008.     else
  2009.         return(TRUE);
  2010. }
  2011.  
  2012. ///
  2013. /// "values"
  2014.  
  2015. /* --------------------------------- SetValueNumber ----------------------------
  2016.  
  2017.  Set numeric value.
  2018.  
  2019. */
  2020.  
  2021. UWORD
  2022. SetValueNumber(struct Value *value, UWORD number)
  2023. {
  2024.     switch (value->Type)
  2025.     {
  2026.         case VALUE_NUMBER:
  2027.  
  2028.             value->Number = number;
  2029.  
  2030.             break;
  2031.  
  2032.         default:
  2033.  
  2034.             Warn(Assert, (APTR)__LINE__);
  2035.     }
  2036.  
  2037.     return(value->Number);
  2038. }
  2039.  
  2040. /* ---------------------------------- SetValueString ---------------------------
  2041.  
  2042.  Set string value. Buffer for string is allocated dynamically (and not
  2043.  reallocated if new value is shorter than previous value). Caller be careful:
  2044.  Empty strings (<string> == "") are either stored as NULL pointer OR as empty
  2045.  string "\0" (if we already have allocated a buffer).
  2046.  
  2047. */
  2048.  
  2049. UBYTE *
  2050. SetValueString(struct Value *value, UBYTE *string)
  2051. {
  2052.     UBYTE numeric[16];
  2053.  
  2054.     // validate option type
  2055.  
  2056.     switch (value->Type)
  2057.     {
  2058.         case VALUE_NUMERIC:
  2059.  
  2060.             // convert to all-digits (unless empty)
  2061.  
  2062.             if (*string)
  2063.             {
  2064.                 sprintf(numeric, "%d", atol(string));
  2065.  
  2066.                 string = numeric;
  2067.             }
  2068.  
  2069.             // fall through
  2070.  
  2071.         case VALUE_STRING:
  2072.  
  2073.             {
  2074.                 ULONG oldsize, newsize;
  2075.  
  2076.                 // get current size of string buffer
  2077.  
  2078.                 if (value->String)
  2079.                     oldsize = MEMSIZE(value->String);
  2080.                 else
  2081.                     oldsize = 0;
  2082.  
  2083.                 if (newsize = strlen(string))
  2084.                 {
  2085.                     ++newsize;
  2086.  
  2087.                     // do we have to allocate a larger string buffer for new value ?
  2088.  
  2089.                     if (newsize > oldsize)
  2090.                     {
  2091.                         if (oldsize)
  2092.  
  2093.                             FreeVec(value->String);
  2094.  
  2095.                         value->String = (UBYTE *)AllocVec(newsize, MEMF_ANY);
  2096.                     }
  2097.  
  2098.                     if (value->String)
  2099.  
  2100.                         strcpy(value->String, string);
  2101.                 }
  2102.                 else if (oldsize)
  2103.  
  2104.                     *value->String = 0;
  2105.             }
  2106.  
  2107.             break;
  2108.  
  2109.         default:
  2110.  
  2111.             Warn(Assert, (APTR)__LINE__);
  2112.     }
  2113.  
  2114.     return(value->String);
  2115. }
  2116.  
  2117. /* ------------------------------ GetValueNumber -------------------------------
  2118.  
  2119.  Get numeric value
  2120.  
  2121. */
  2122.  
  2123. UWORD
  2124. GetValueNumber(struct Value *value)
  2125. {
  2126.     switch (value->Type)
  2127.     {
  2128.         case VALUE_NUMBER:
  2129.  
  2130.             return(value->Number);
  2131.  
  2132.             break;
  2133.  
  2134.         default:
  2135.  
  2136.             Warn(Assert, (APTR)__LINE__);
  2137.  
  2138.             return(UNDEFINED);
  2139.     }
  2140. }
  2141.  
  2142. /* ------------------------------ GetValueString -------------------------------
  2143.  
  2144.  Get string value
  2145.  
  2146. */
  2147.  
  2148. UBYTE *
  2149. GetValueString(struct Value *value)
  2150. {
  2151.     switch (value->Type)
  2152.     {
  2153.         case VALUE_STRING:
  2154.         case VALUE_NUMERIC:
  2155.  
  2156.             return(value->String);
  2157.  
  2158.             break;
  2159.  
  2160.         default:
  2161.  
  2162.             Warn(Assert, (APTR)__LINE__);
  2163.  
  2164.             return(NULL);
  2165.     }
  2166. }
  2167.  
  2168. /* ------------------------------ GetValueList ---------------------------------
  2169.  
  2170.  Get list value
  2171.  
  2172. */
  2173.  
  2174. struct List *
  2175. GetValueList(struct Value *value)
  2176. {
  2177.     switch (value->Type)
  2178.     {
  2179.         case VALUE_LIST:
  2180.  
  2181.             return(&value->List);
  2182.  
  2183.             break;
  2184.  
  2185.         default:
  2186.  
  2187.             Warn(Assert, (APTR)__LINE__);
  2188.  
  2189.             return((struct List *)NULL);
  2190.     }
  2191. }
  2192.  
  2193. /* -------------------------------- FreeValue ----------------------------------
  2194.  
  2195.  Free (and reset) specified value
  2196.  
  2197. */
  2198.  
  2199. void
  2200. FreeValue(struct Value *value)
  2201. {
  2202.     switch (value->Type)
  2203.     {
  2204.         case VALUE_NUMBER:
  2205.  
  2206.             value->Number = 0;
  2207.  
  2208.             break;
  2209.  
  2210.         case VALUE_NUMERIC:
  2211.         case VALUE_STRING:
  2212.  
  2213.             if (value->String)
  2214.             {
  2215.                 FreeVec(value->String);
  2216.  
  2217.                 value->String =  NULL;
  2218.             }
  2219.  
  2220.             break;
  2221.  
  2222.         case VALUE_LIST:
  2223.  
  2224.             FreeNodes(&value->List);
  2225.  
  2226.             break;
  2227.     }
  2228. }
  2229.  
  2230. ///
  2231. /// "gui"
  2232.  
  2233. /* ----------------------------- ShowUserInterface -----------------------------
  2234.  
  2235.  Create main window
  2236.  
  2237. */
  2238.  
  2239. struct WindowSupportInfo *
  2240. ShowUserInterface()
  2241. {
  2242.     // create gadget class
  2243.  
  2244.     if (Config.Context.IClass = MakeClass(NULL, "gadgetclass", NULL, sizeof(struct BoopsiGadget), 0))
  2245.     {
  2246.         Config.Context.IClass->cl_Dispatcher.h_Entry = (HOOKFUNC)boopsi_GadgetDispatch;
  2247.  
  2248.         Config.Context.IClass->cl_UserData = (ULONG)&Config.Context;
  2249.  
  2250.         // lock screen
  2251.  
  2252.         PubScreenName = Config.Pubscreen;
  2253.  
  2254.         if (SetupScreen() == 0)
  2255.         {
  2256.             if (Config.Device = boopsi_CreateDeviceContext(Scr, Scr->RastPort.Font))
  2257.             {
  2258.                 struct WindowSupportInfo *info;
  2259.  
  2260.                 // create menu
  2261.  
  2262.                 if (Config.Menu = CreateMenus(NewMenu, TAG_DONE))
  2263.                 {
  2264.                     if (LayoutMenus(Config.Menu, VisualInfo, GTMN_NewLookMenus, TRUE, TAG_DONE) == FALSE)
  2265.                     {
  2266.                         FreeMenus(Config.Menu);
  2267.  
  2268.                         Config.Menu = NULL;
  2269.                     }
  2270.                 }
  2271.  
  2272.                 // open (empty) window
  2273.  
  2274.                 if (info = OpenDialog(INDEXLeft, INDEXTop, INDEXWidth, INDEXHeight, PROGRAMNAME " Â©2003 Dietmar Eilert", WFLG_DRAGBAR | WFLG_SMART_REFRESH  | WFLG_DEPTHGADGET | WFLG_ACTIVATE))
  2275.                 {
  2276.                     // attach menu
  2277.  
  2278.                     if (Config.Menu)
  2279.  
  2280.                         SetMenuStrip(info->Window, Config.Menu);
  2281.  
  2282.                     return(info);
  2283.                 }
  2284.             }
  2285.         }
  2286.     }
  2287.     else
  2288.         Warn("Gadget class initialization failed !", NULL);
  2289.  
  2290.     CloseUserInterface();
  2291.  
  2292.     return(NULL);
  2293. }
  2294.  
  2295. /* ---------------------------- CloseUserInterface -----------------------------
  2296.  
  2297.  Close main window and release screen
  2298.  
  2299. */
  2300.  
  2301. void
  2302. CloseUserInterface()
  2303. {
  2304.     struct WindowSupportInfo *info, *next;
  2305.  
  2306.     for (info = (struct WindowSupportInfo *)Config.Windows.lh_Head; next = (struct WindowSupportInfo *)info->Node.ln_Succ; info = next)
  2307.     {
  2308.         CloseWindowSafely(info);
  2309.     }
  2310.  
  2311.     if (Config.Device)
  2312.     {
  2313.         boopsi_FreeDeviceContext(Config.Device);
  2314.  
  2315.         Config.Device = NULL;
  2316.     }
  2317.  
  2318.     CloseDownScreen();
  2319.  
  2320.     if (Config.Menu)
  2321.     {
  2322.         FreeMenus(Config.Menu);
  2323.  
  2324.         Config.Menu = NULL;
  2325.     }
  2326.  
  2327.     if (Config.Context.IClass)
  2328.     {
  2329.         FreeClass(Config.Context.IClass);
  2330.  
  2331.         Config.Context.IClass = NULL;
  2332.     }
  2333. }
  2334.  
  2335. /* -------------------------------- OpenDialog ---------------------------------
  2336.  
  2337.  Open window (<win_w> and <win_h> are scaled based on what font is used)
  2338.  
  2339. */
  2340.  
  2341. struct WindowSupportInfo *
  2342. OpenDialog(UWORD win_x, UWORD win_y, UWORD win_w, UWORD win_h, UBYTE *title, ULONG flags)
  2343. {
  2344.     struct WindowSupportInfo *info;
  2345.  
  2346.     if (info = (struct WindowSupportInfo *)AllocVec(sizeof(struct WindowSupportInfo), MEMF_ANY | MEMF_CLEAR))
  2347.     {
  2348.         // open window
  2349.  
  2350.         LayoutDialog(info, win_w, win_h);
  2351.  
  2352.         if ((win_x + info->WinW) > Scr->Width)
  2353.  
  2354.             win_x = Scr->Width - info->WinW;
  2355.  
  2356.         if ((win_y + info->WinH) > Scr->Height)
  2357.  
  2358.             win_y = Scr->Height - info->WinH;
  2359.  
  2360.         info->Window = OpenWindowTags(NULL,
  2361.  
  2362.             WA_Flags,        flags,
  2363.             WA_Left,         win_x,
  2364.             WA_Top,          win_y,
  2365.             WA_Width,        info->WinW,
  2366.             WA_Height,       info->WinH,
  2367.             WA_Title,        title,
  2368.             WA_ScreenTitle,  title,
  2369.             WA_PubScreen,    Scr,
  2370.             WA_NewLookMenus, TRUE,
  2371.             WA_IDCMP,        IDCMP_REFRESHWINDOW | IDCMP_MENUPICK | IDCMP_IDCMPUPDATE | IDCMP_NEWSIZE | BUTTONIDCMP | LISTVIEWIDCMP | CYCLEIDCMP | STRINGIDCMP,
  2372.             TAG_DONE
  2373.         );
  2374.  
  2375.         if (info->Window)
  2376.         {
  2377.             // connect info with window
  2378.  
  2379.             info->Window->UserData = (BYTE *)info;
  2380.  
  2381.             AddTail(&Config.Windows, &info->Node);
  2382.  
  2383.             return(info);
  2384.         }
  2385.  
  2386.         FreeVec(info);
  2387.     }
  2388.  
  2389.     return(NULL);
  2390. }
  2391.  
  2392. /* ----------------------------- CloseWindowSafely -----------------------------
  2393.  
  2394.  Close window
  2395.  
  2396. */
  2397.  
  2398. void
  2399. CloseWindowSafely(struct WindowSupportInfo *info)
  2400. {
  2401.     struct Window *win;
  2402.  
  2403.     Remove(&info->Node);
  2404.  
  2405.     if (win = info->Window)
  2406.     {
  2407.         DetachGadgets(info, FALSE);
  2408.  
  2409.         ClearMenuStrip(win);
  2410.  
  2411.         CloseWindow(win);
  2412.     }
  2413.  
  2414.     FreeVec(info);
  2415. }
  2416.  
  2417. /* ---------------------------- DiscardInputEvents -----------------------------
  2418.  
  2419.  Discard unprocessed input
  2420.  
  2421. */
  2422.  
  2423. void
  2424. DiscardInputEvents(struct Window *win)
  2425. {
  2426.     struct IntuiMessage *imsg;
  2427.  
  2428.     while (imsg = (struct IntuiMessage *)GT_GetIMsg(win->UserPort))
  2429.  
  2430.         GT_ReplyIMsg(imsg);
  2431. }
  2432.  
  2433. /* -------------------------------- LayoutDialog -------------------------------
  2434.  
  2435.  Choose font for dialog of specified size
  2436.  
  2437. */
  2438.  
  2439. void
  2440. LayoutDialog(struct WindowSupportInfo *info, UWORD width, UWORD height)
  2441. {
  2442.     struct TextFont *screenfont = Scr->RastPort.Font;
  2443.  
  2444.     info->TextAttr.ta_Name  = screenfont->tf_Message.mn_Node.ln_Name;
  2445.     info->TextAttr.ta_YSize = screenfont->tf_YSize;
  2446.  
  2447.     info->FontY = screenfont->tf_YSize;
  2448.  
  2449.     // calculate average width of characters in font
  2450.  
  2451.     info->FontX = (TextLength(&Scr->RastPort, "TESTtest", 8) + 4) / 8;
  2452.  
  2453.     info->OffX  = Scr->WBorLeft;
  2454.     info->OffY  = Scr->RastPort.TxHeight + Scr->WBorTop + 1;
  2455.  
  2456.     info->WinW  = ScaleX(info, width ) + info->OffX + Scr->WBorRight ;
  2457.     info->WinH  = ScaleY(info, height) + info->OffY + Scr->WBorBottom;
  2458.  
  2459.     // fall back to topaz ?
  2460.  
  2461.     if ((info->WinW > Scr->Width) || (info->WinH >Scr->Height))
  2462.     {
  2463.         info->TextAttr.ta_Name  = "topaz.font";
  2464.         info->TextAttr.ta_YSize = 8;
  2465.  
  2466.         info->FontX = 8;
  2467.         info->FontY = 8;
  2468.  
  2469.         info->WinW  = ScaleX(info, width ) + info->OffX + Scr->WBorRight ;
  2470.         info->WinH  = ScaleY(info, height) + info->OffY + Scr->WBorBottom;
  2471.     }
  2472. }
  2473.  
  2474. /* ---------------------------------- ScaleX -----------------------------------
  2475.  
  2476.  Scale <value>
  2477.  
  2478. */
  2479.  
  2480. UWORD
  2481. ScaleX(struct WindowSupportInfo *info, UWORD value)
  2482. {
  2483.     return((UWORD)(((info->FontX * value) + 4) / 8));
  2484. }
  2485.  
  2486. /* ---------------------------------- ScaleY -----------------------------------
  2487.  
  2488.  Scale <value>. 14 pixel is gadget height for topaz 8, ie. 14 - 8 = 6 "border
  2489.  pixels" and 8 text pixels (scaling required).
  2490.  
  2491. */
  2492.  
  2493. UWORD
  2494. ScaleY(struct WindowSupportInfo *info, UWORD value)
  2495. {
  2496.     return((UWORD)((value * (info->FontY + 6)) / 14));
  2497. }
  2498.  
  2499. /* --------------------------------- ShowPage ----------------------------------
  2500.  
  2501.  Show specified page
  2502.  
  2503. */
  2504.  
  2505. BOOL
  2506. ShowPage(struct WindowSupportInfo *info, UWORD page)
  2507. {
  2508.     struct Window *win;
  2509.     UWORD          x;
  2510.     UWORD          y;
  2511.  
  2512.     win = info->Window;
  2513.  
  2514.     DetachGadgets(info, TRUE);
  2515.  
  2516.     // render separator line
  2517.  
  2518.     x = info->OffX + ScaleX(info, 10 );
  2519.     y = info->OffY + ScaleY(info, 157);
  2520.  
  2521.     SetAPen (win->RPort, 0);
  2522.     RectFill(win->RPort, win->BorderLeft, win->BorderTop, win->Width - win->BorderRight - 1, win->Height - win->BorderBottom - 1);
  2523.  
  2524.     boopsi_Line3D(&Config.Context, Config.Device, info->Window->RPort, x, y, ScaleX(info, 612), 0);
  2525.  
  2526.     if (page < PAGE_MAXIMUM)
  2527.     {
  2528.         struct PageLayout *layout = &Layouts[page];
  2529.  
  2530.         info->Layout = layout;
  2531.         info->Page   = page;
  2532.  
  2533.         if (layout->Gadgets < MAX_GADGETS)
  2534.         {
  2535.             struct Gadget *gadget;
  2536.  
  2537.             if (gadget = CreateContext(&info->Context))
  2538.             {
  2539.                 struct NewGadget ng;
  2540.                 UWORD            magnetic[12];
  2541.                 ULONG           *tags;
  2542.                 UWORD            ID;
  2543.                 UWORD            delta;
  2544.                 UWORD            n;
  2545.  
  2546.                 tags = layout->Tags;
  2547.  
  2548.                 ng.ng_TextAttr   = &info->TextAttr;
  2549.                 ng.ng_VisualInfo = VisualInfo;
  2550.  
  2551.                 // calculate best button spacing (one free row between buttons)
  2552.  
  2553.                 delta = ScaleY(info, 14) + 1;
  2554.  
  2555.                 // calculate magnetic points for improved gadget positioning
  2556.  
  2557.                 magnetic[0] = info->OffY + ScaleY(info, 9);
  2558.  
  2559.                 for (n = 1; n < 12; ++n)
  2560.                 {
  2561.                     magnetic[n] = magnetic[n - 1] + delta;
  2562.                 }
  2563.  
  2564.                 for (ID = 0; ID < layout->Gadgets; ++ID)
  2565.                 {
  2566.                     ULONG             boopsitags[50];
  2567.                     ULONG            *tagptr;
  2568.                     struct NewGadget *template;
  2569.                     UWORD             n;
  2570.                     UWORD             kind;
  2571.  
  2572.                     template = &layout->NewGadget[ID];
  2573.  
  2574.                     ng.ng_GadgetID   = ID;
  2575.                     ng.ng_GadgetText = template->ng_GadgetText;
  2576.                     ng.ng_Flags      = template->ng_Flags;
  2577.                     ng.ng_LeftEdge   = ScaleX(info, template->ng_LeftEdge) + info->OffX;
  2578.                     ng.ng_TopEdge    = ScaleY(info, template->ng_TopEdge ) + info->OffY;
  2579.                     ng.ng_Width      = ScaleX(info, template->ng_Width   );
  2580.                     ng.ng_Height     = ScaleY(info, template->ng_Height  );
  2581.  
  2582.                     // y-coordinate near magnetic point ?
  2583.  
  2584.                     for (n = 0; n < 12; ++n)
  2585.                     {
  2586.                         if (magnetic[n] > ng.ng_TopEdge)
  2587.                         {
  2588.                             if ((magnetic[n] - ng.ng_TopEdge) <= 3)
  2589.  
  2590.                                 ng.ng_TopEdge = magnetic[n];
  2591.  
  2592.                             break;
  2593.                         }
  2594.                         else if ((ng.ng_TopEdge - magnetic[n]) <= 3)
  2595.                         {
  2596.                             ng.ng_TopEdge = magnetic[n];
  2597.  
  2598.                             break;
  2599.                         }
  2600.                     }
  2601.  
  2602.                     // convert gadtools gadgets to boopsi gadgets (and add tags required for boopsi gadgets)
  2603.  
  2604.                     tagptr = boopsitags;
  2605.  
  2606.                     switch (kind = layout->Types[ID])
  2607.                     {
  2608.                         case CYCLE_KIND:
  2609.  
  2610.                             kind = BOOPSI_DROPBOX_KIND;
  2611.  
  2612.                             *tagptr++ = (ULONG)BOOPSI_ATTRIB_FLAGS;
  2613.  
  2614.                             // highlight default entry in dropbox
  2615.  
  2616.                             *tagptr++ = (ULONG)BOOPSI_FLAGS_FANCY;
  2617.  
  2618.                             break;
  2619.  
  2620.                         case BUTTON_KIND:
  2621.  
  2622.                             kind = BOOPSI_BUTTON_KIND;
  2623.  
  2624.                             // attach pop-up menu to button ?
  2625.  
  2626.                             #ifdef TARGET_GCC
  2627.  
  2628.                             switch (page)
  2629.                             {
  2630.                                 case PAGE_MESSAGES:
  2631.  
  2632.                                     switch (ID)
  2633.                                     {
  2634.                                         case GD_ADDDISABLED:
  2635.                                         case GD_ADDENABLED:
  2636.  
  2637.                                             {
  2638.                                                 *tagptr++ = (ULONG)GTCY_Labels;
  2639.                                                 *tagptr++ = (ULONG)SuggestionsForWarnings;
  2640.                                             }
  2641.  
  2642.                                             break;
  2643.                                     }
  2644.                             }
  2645.  
  2646.                             #endif
  2647.  
  2648.                             break;
  2649.                     }
  2650.  
  2651.                     // create gadget
  2652.  
  2653.                     switch (kind)
  2654.                     {
  2655.                         case BOOPSI_BUTTON_KIND:
  2656.                         case BOOPSI_DROPBOX_KIND:
  2657.  
  2658.                             *tagptr++ = (ULONG)BOOPSI_ATTRIB_KIND;
  2659.                             *tagptr++ = (ULONG)kind;
  2660.                             *tagptr++ = (ULONG)BOOPSI_ATTRIB_DEVICE;
  2661.                             *tagptr++ = (ULONG)Config.Device;
  2662.                             *tagptr++ = (ULONG)BOOPSI_ATTRIB_PLACEMENT;
  2663.                             *tagptr++ = (ULONG)ng.ng_Flags;
  2664.                             *tagptr++ = (ULONG)GA_ID;
  2665.                             *tagptr++ = (ULONG)ID;
  2666.                             *tagptr++ = (ULONG)GA_Top;
  2667.                             *tagptr++ = (ULONG)ng.ng_TopEdge;
  2668.                             *tagptr++ = (ULONG)GA_Left;
  2669.                             *tagptr++ = (ULONG)ng.ng_LeftEdge;
  2670.                             *tagptr++ = (ULONG)GA_Width;
  2671.                             *tagptr++ = (ULONG)ng.ng_Width;
  2672.                             *tagptr++ = (ULONG)GA_Height;
  2673.                             *tagptr++ = (ULONG)ng.ng_Height;
  2674.                             *tagptr++ = (ULONG)GA_Text;
  2675.                             *tagptr++ = (ULONG)ng.ng_GadgetText;
  2676.                             *tagptr++ = (ULONG)GA_TabCycle;
  2677.                             *tagptr++ = (ULONG)TRUE;
  2678.                             *tagptr++ = (ULONG)GA_Previous;
  2679.                             *tagptr++ = (ULONG)gadget;
  2680.                             *tagptr++ = (ULONG)ICA_TARGET;
  2681.                             *tagptr++ = (ULONG)ICTARGET_IDCMP;
  2682.                             *tagptr++ = (ULONG)TAG_MORE;
  2683.                             *tagptr   = (ULONG)tags;
  2684.  
  2685.                             gadget = (struct Gadget *)NewObjectA(Config.Context.IClass, NULL, (struct TagItem *)boopsitags);
  2686.  
  2687.                             break;
  2688.  
  2689.                         case LISTVIEW_KIND:
  2690.  
  2691.                             {
  2692.                                 struct TagItem *tag;
  2693.  
  2694.                                 // join last gadget (string gadget) with this listview ?
  2695.  
  2696.                                 if (tag = FindTagItem(GTLV_ShowSelected, (struct TagItem *)tags))
  2697.  
  2698.                                     tag->ti_Data = (ULONG)gadget;
  2699.                             }
  2700.  
  2701.                             // fall through
  2702.  
  2703.                         default:
  2704.  
  2705.                             gadget = CreateGadgetA(kind, gadget, &ng, (struct TagItem *)tags);
  2706.                     }
  2707.  
  2708.                     if (gadget)
  2709.                     {
  2710.                         info->GadgetPtr[ID] = gadget;
  2711.  
  2712.                         // skip to end of tags for this gadget
  2713.  
  2714.                         while (*tags)
  2715.                         {
  2716.                             tags += 2;
  2717.                         }
  2718.  
  2719.                         // skip over TAG_END
  2720.  
  2721.                         ++tags;
  2722.                     }
  2723.                     else
  2724.                         break;
  2725.                 }
  2726.  
  2727.                 if (gadget)
  2728.                 {
  2729.                     // count gadgets
  2730.  
  2731.                     info->Gadgets = 0;
  2732.  
  2733.                     for (gadget = info->Context; gadget; gadget = gadget->NextGadget)
  2734.  
  2735.                         ++info->Gadgets;
  2736.  
  2737.                     // refresh gadgets
  2738.  
  2739.                     AddGList(win, info->Context, 0, info->Gadgets, NULL);
  2740.  
  2741.                     RefreshPage(info);
  2742.  
  2743.                     RefreshGadgets(info->Context, info->Window, NULL);
  2744.  
  2745.                     GT_RefreshWindow(info->Window, NULL);
  2746.  
  2747.                     // render strings
  2748.  
  2749.                     if (layout->IntuiText)
  2750.                     {
  2751.                         struct IntuiText *itext;
  2752.  
  2753.                         for (itext = layout->IntuiText; itext; itext = itext->NextText)
  2754.                         {
  2755.                             struct IntuiText it = *itext;
  2756.  
  2757.                             // set rendering details
  2758.  
  2759.                             it.ITextFont = &info->TextAttr;
  2760.                             it.FrontPen  = itext->FrontPen;
  2761.                             it.BackPen   = itext->BackPen;
  2762.                             it.DrawMode  = itext->DrawMode;
  2763.                             it.IText     = itext->IText;
  2764.                             it.NextText  = NULL;
  2765.  
  2766.                             // find string position
  2767.  
  2768.                             it.TopEdge   = info->OffY + ScaleY(info, itext->TopEdge );
  2769.                             it.LeftEdge  = info->OffX + ScaleX(info, itext->LeftEdge) + (ScaleX(info, IntuiTextLength(itext)) - IntuiTextLength(&it)) / 2;
  2770.  
  2771.                             PrintIText(info->Window->RPort, &it, 0, 0);
  2772.                         }
  2773.                     }
  2774.  
  2775.                     return(TRUE);
  2776.                 }
  2777.                 else
  2778.                 {
  2779.                     FreeGadgets(info->Context);
  2780.  
  2781.                     info->Context = NULL;
  2782.                 }
  2783.             }
  2784.         }
  2785.     }
  2786.     else
  2787.         Warn(Assert, (APTR)__LINE__);
  2788.  
  2789.     CloseUserInterface();
  2790.  
  2791.     return(FALSE);
  2792. }
  2793.  
  2794. /* -------------------------------- DetachGadgets ------------------------------
  2795.  
  2796.  Detach gadgets from window
  2797.  
  2798. */
  2799.  
  2800. void
  2801. DetachGadgets(struct WindowSupportInfo *info, BOOL fillbackground)
  2802. {
  2803.     DiscardInputEvents(info->Window);
  2804.  
  2805.     if (info->Context)
  2806.     {
  2807.         struct Window *win = info->Window;
  2808.  
  2809.         // save current state of gadgets
  2810.  
  2811.         ReadPage(info);
  2812.  
  2813.         // detach and free gadgets
  2814.  
  2815.         RemoveGadgetList(win, info->Context, info->Gadgets);
  2816.  
  2817.         FreeGadgets(info->Context);
  2818.  
  2819.         memset(info->GadgetPtr, 0, sizeof(info->GadgetPtr));
  2820.  
  2821.         info->Context = NULL;
  2822.  
  2823.         // erase window
  2824.  
  2825.         if (fillbackground)
  2826.         {
  2827.             SetAPen (win->RPort, 0);
  2828.  
  2829.             RectFill(win->RPort, win->BorderLeft, win->BorderTop, win->Width - win->BorderRight - 1, win->Height - win->BorderBottom - 1);
  2830.         }
  2831.     }
  2832.  
  2833.     info->Layout = NULL;
  2834. }
  2835.  
  2836. /* ------------------------------- RemoveGadgetList ----------------------------
  2837.  
  2838.  Fixes RemoveGList() bug (NULL-terminates last gadget in list)
  2839.  
  2840. */
  2841.  
  2842. void
  2843. RemoveGadgetList(win, gadget, numgad)
  2844.  
  2845. struct Window *win;
  2846. struct Gadget *gadget;
  2847. UWORD          numgad;
  2848. {
  2849.     if (numgad) {
  2850.  
  2851.         RemoveGList(win, gadget, numgad);
  2852.  
  2853.         // terminate removed list
  2854.  
  2855.         while (gadget) {
  2856.  
  2857.             if (--numgad)
  2858.             {
  2859.                 gadget = gadget->NextGadget;
  2860.             }
  2861.             else
  2862.                 break;
  2863.         }
  2864.  
  2865.         if (gadget)
  2866.  
  2867.             gadget->NextGadget = NULL;
  2868.     }
  2869. }
  2870.  
  2871. /* -------------------------------- RefreshPage --------------------------------
  2872.  
  2873.  Refresh gadgets
  2874.  
  2875. */
  2876.  
  2877. void
  2878. RefreshPage(struct WindowSupportInfo *info)
  2879. {
  2880.     struct Options *options;
  2881.  
  2882.     if (options = info->Options)
  2883.     {
  2884.         struct Syntax  *syntax;
  2885.         BOOL            show[OPTIONS_MAXIMUM];
  2886.  
  2887.         memset(show, TRUE, sizeof(show));
  2888.  
  2889.         // loop through syntax table
  2890.  
  2891.         for (syntax = Syntax; syntax->ID < OPTIONS_MAXIMUM; ++syntax)
  2892.         {
  2893.             // option visible ?
  2894.  
  2895.             if (syntax->Page == info->Page)
  2896.             {
  2897.                 UWORD ID = syntax->ID;
  2898.  
  2899.                 // option not yet refreshed ?
  2900.  
  2901.                 if (show[ID])
  2902.                 {
  2903.                     struct Gadget *gadget;
  2904.  
  2905.                     show[ID] = FALSE;
  2906.  
  2907.                     // find gadget associated with option
  2908.  
  2909.                     if (gadget = info->GadgetPtr[syntax->GadgetID])
  2910.                     {
  2911.                         // validate gadget type
  2912.  
  2913.                         if (info->Layout->Types[gadget->GadgetID] == syntax->GadgetType)
  2914.                         {
  2915.                             struct Value *value = &info->Options->Values[ID];
  2916.  
  2917.                             switch (syntax->GadgetType)
  2918.                             {
  2919.                                 case CYCLE_KIND:
  2920.  
  2921.                                     {
  2922.                                         UWORD number = GetValueNumber(value);
  2923.  
  2924.                                         SetGadgetAttrs(gadget, info->Window, NULL, GTCY_Active, number, TAG_DONE);
  2925.                                     }
  2926.  
  2927.                                     break;
  2928.  
  2929.                                 case STRING_KIND:
  2930.                                 case TEXT_KIND:
  2931.  
  2932.                                     {
  2933.                                         UBYTE *string = GetValueString(value);
  2934.  
  2935.                                         if (string == NULL)
  2936.  
  2937.                                             string = "";
  2938.  
  2939.                                         if (syntax->GadgetType == TEXT_KIND)
  2940.                                             GT_SetGadgetAttrs(gadget, info->Window, NULL, GTTX_Text  , string, TAG_DONE);
  2941.                                         else
  2942.                                             GT_SetGadgetAttrs(gadget, info->Window, NULL, GTST_String, string, TAG_DONE);
  2943.                                     }
  2944.  
  2945.                                     break;
  2946.  
  2947.                                 case INTEGER_KIND:
  2948.  
  2949.                                     {
  2950.                                         UWORD number = GetValueNumber(value);
  2951.  
  2952.                                         GT_SetGadgetAttrs(gadget, info->Window, NULL, GTIN_Number, number, TAG_DONE);
  2953.                                     }
  2954.  
  2955.                                     break;
  2956.  
  2957.                                 case LISTVIEW_KIND:
  2958.  
  2959.                                     {
  2960.                                         struct List *list = GetValueList(value);
  2961.  
  2962.                                         GT_SetGadgetAttrs(gadget, info->Window, NULL, GTLV_Labels, list, TAG_DONE);
  2963.                                     }
  2964.  
  2965.                                     break;
  2966.  
  2967.                                 default:
  2968.  
  2969.                                     Warn(Assert, (APTR)__LINE__);
  2970.                             }
  2971.                         }
  2972.                         else
  2973.                             Warn(Assert, (APTR)__LINE__);
  2974.                     }
  2975.                     else
  2976.                         Warn(Assert, (APTR)__LINE__);
  2977.  
  2978.                     show[ID] = FALSE;
  2979.                 }
  2980.             }
  2981.         }
  2982.     }
  2983.  
  2984.     RefreshGhosting(info);
  2985. }
  2986.  
  2987. /* ------------------------------ RefreshGhosting ------------------------------
  2988.  
  2989.  Update gadget ghosting
  2990.  
  2991. */
  2992.  
  2993. void
  2994. RefreshGhosting(struct WindowSupportInfo *info)
  2995. {
  2996.     struct Gadget **gadgets;
  2997.     UWORD           gadgetID;
  2998.  
  2999.     // examine visible gadgets
  3000.  
  3001.     gadgets = info->GadgetPtr;
  3002.  
  3003.     for (gadgetID = 0; gadgetID < info->Gadgets; ++gadgetID)
  3004.     {
  3005.         struct Connectivity *connectivity;
  3006.  
  3007.         // loop through connectivity rules
  3008.  
  3009.         for (connectivity = Connectivity; connectivity->Page < PAGE_MAXIMUM; ++connectivity)
  3010.         {
  3011.             // does connectivity rule apply to next gadget ?
  3012.  
  3013.             if ((connectivity->Page == info->Page) && (connectivity->GadgetID == gadgetID))
  3014.             {
  3015.                 struct Gadget *gadget;
  3016.                 struct Gadget *target;
  3017.                 UWORD          targettype;
  3018.  
  3019.                 gadget = gadgets[gadgetID];
  3020.  
  3021.                 if (target = gadgets[connectivity->TargetID])
  3022.                     targettype = info->Layout->Types[connectivity->TargetID];
  3023.                 else
  3024.                     targettype = UNDEFINED;
  3025.  
  3026.                 if (gadget)
  3027.                 {
  3028.                     switch (connectivity->Action)
  3029.                     {
  3030.                         case ACTION_DEL:
  3031.                         case ACTION_EDIT:
  3032.  
  3033.                             {
  3034.                                 if (targettype == LISTVIEW_KIND)
  3035.                                 {
  3036.                                     ULONG selected = UNDEFINED;
  3037.  
  3038.                                     GT_GetGadgetAttrs(target, info->Window, NULL, GTLV_Selected, &selected, TAG_DONE);
  3039.  
  3040.                                     GT_SetGadgetAttrs(gadget, info->Window, NULL, GA_Disabled, (selected == (ULONG)~0), TAG_DONE);
  3041.                                 }
  3042.                                 else
  3043.                                     Warn(Assert, (APTR)__LINE__);
  3044.                             }
  3045.  
  3046.                             break;
  3047.                     }
  3048.  
  3049.                 }
  3050.                 else
  3051.                     Warn(Assert, (APTR)__LINE__);
  3052.             }
  3053.         }
  3054.     }
  3055. }
  3056.  
  3057. /* --------------------------------- ReadPage ----------------------------------
  3058.  
  3059.  Read current state of gadgets
  3060.  
  3061. */
  3062.  
  3063. void
  3064. ReadPage(struct WindowSupportInfo *info)
  3065. {
  3066.     struct Options *options;
  3067.  
  3068.     if (options = info->Options)
  3069.     {
  3070.         UWORD gadgetID;
  3071.  
  3072.         // examine visible gadgets
  3073.  
  3074.         for (gadgetID = 0; gadgetID < info->Gadgets; ++gadgetID)
  3075.         {
  3076.             struct Syntax *syntax;
  3077.  
  3078.             // loop through syntax table and find rule for next gadget
  3079.  
  3080.             for (syntax = Syntax; syntax->ID < OPTIONS_MAXIMUM; ++syntax)
  3081.             {
  3082.                 // option visible and associated with gadget ?
  3083.  
  3084.                 if ((syntax->Page == info->Page) && (syntax->GadgetID == gadgetID))
  3085.                 {
  3086.                     struct Gadget *gadget;
  3087.  
  3088.                     if (gadget = info->GadgetPtr[gadgetID])
  3089.                     {
  3090.                         // validate gadget type
  3091.  
  3092.                         if (info->Layout->Types[gadgetID] == syntax->GadgetType)
  3093.                         {
  3094.                             // copy gadget state to option
  3095.  
  3096.                             struct Value *value = &info->Options->Values[syntax->ID];
  3097.  
  3098.                             switch (syntax->GadgetType)
  3099.                             {
  3100.                                 case CYCLE_KIND:
  3101.  
  3102.                                     {
  3103.                                         ULONG active;
  3104.  
  3105.                                         GetAttr(GTCY_Active, gadget, &active);
  3106.  
  3107.                                         SetValueNumber(value, active);
  3108.                                     }
  3109.  
  3110.                                     break;
  3111.  
  3112.                                 case STRING_KIND:
  3113.  
  3114.                                     {
  3115.                                         ULONG string;
  3116.  
  3117.                                         GT_GetGadgetAttrs(gadget, info->Window, NULL, GTST_String, &string, TAG_DONE);
  3118.  
  3119.                                         SetValueString(value, (UBYTE *)string);
  3120.                                     }
  3121.  
  3122.                                     break;
  3123.  
  3124.                                 case TEXT_KIND:
  3125.  
  3126.                                     {
  3127.                                         ULONG string;
  3128.  
  3129.                                         GT_GetGadgetAttrs(gadget, info->Window, NULL, GTTX_Text, &string, TAG_DONE);
  3130.  
  3131.                                         SetValueString(value, (UBYTE *)string);
  3132.                                     }
  3133.  
  3134.                                     break;
  3135.  
  3136.                                 case INTEGER_KIND:
  3137.  
  3138.                                     {
  3139.                                         ULONG number;
  3140.  
  3141.                                         GT_GetGadgetAttrs(gadget, info->Window, NULL, GTIN_Number, &number, TAG_DONE);
  3142.  
  3143.                                         SetValueNumber(value, number);
  3144.                                     }
  3145.  
  3146.                                     break;
  3147.                             }
  3148.                         }
  3149.                         else
  3150.                             Warn(Assert, (APTR)__LINE__);
  3151.                     }
  3152.  
  3153.                     // examine next gadget
  3154.  
  3155.                     break;
  3156.                 }
  3157.             }
  3158.         }
  3159.     }
  3160. }
  3161.  
  3162. /* ----------------------------------- Warn ------------------------------------
  3163.  
  3164.  Show error message
  3165.  
  3166. */
  3167.  
  3168. void
  3169. Warn(UBYTE *template, APTR data)
  3170. {
  3171.     struct EasyStruct easyStruct;
  3172.  
  3173.     easyStruct.es_StructSize   = sizeof(struct EasyStruct);
  3174.     easyStruct.es_Flags        = 0;
  3175.     easyStruct.es_Title        = PROGRAMNAME;
  3176.     easyStruct.es_GadgetFormat = "Ok";
  3177.  
  3178.     if (strchr(template, '%'))
  3179.     {
  3180.         UBYTE *message;
  3181.  
  3182.         if (message = (UBYTE *)AllocVec(strlen(template) + MAX_PATHLEN, MEMF_ANY))
  3183.         {
  3184.             sprintf(message, template, data);
  3185.  
  3186.             easyStruct.es_TextFormat = message;
  3187.  
  3188.             EasyRequestArgs(NULL, &easyStruct, NULL, NULL);
  3189.  
  3190.             FreeVec(message);
  3191.         }
  3192.     }
  3193.     else
  3194.     {
  3195.         easyStruct.es_TextFormat = template;
  3196.  
  3197.         EasyRequestArgs(NULL, &easyStruct, NULL, NULL);
  3198.     }
  3199. }
  3200.  
  3201. ///
  3202. /// "gadgets"
  3203.  
  3204. /* --------------------------- DefaultGadgetHandler ----------------------------
  3205.  
  3206.  Process click on gadget
  3207.  
  3208. */
  3209.  
  3210. void
  3211. DefaultGadgetHandler(struct WindowSupportInfo *info, UWORD gadgetID)
  3212. {
  3213.     struct Connectivity *connectivity;
  3214.     BOOL                 refresh;
  3215.  
  3216.     refresh = FALSE;
  3217.  
  3218.     // loop through connectivity rules
  3219.  
  3220.     for (connectivity = Connectivity; connectivity->Page < PAGE_MAXIMUM; ++connectivity)
  3221.     {
  3222.         // does connectivity rule apply to next gadget ?
  3223.  
  3224.         if ((connectivity->Page == info->Page) && (connectivity->GadgetID == gadgetID))
  3225.         {
  3226.             struct Window *window;
  3227.             struct Gadget *gadget;
  3228.             struct Gadget *target;
  3229.             UWORD          targettype;
  3230.  
  3231.             window = info->Window;
  3232.  
  3233.             gadget = info->GadgetPtr[gadgetID];
  3234.  
  3235.             // target gadget ?
  3236.  
  3237.             if (target = info->GadgetPtr[connectivity->TargetID])
  3238.                 targettype = info->Layout->Types[connectivity->TargetID];
  3239.             else
  3240.                 targettype = UNDEFINED;
  3241.  
  3242.             if (gadget)
  3243.             {
  3244.                 UBYTE *name = "unnamed";
  3245.  
  3246.                 switch (connectivity->Action)
  3247.                 {
  3248.                     case ACTION_REFRESH:
  3249.  
  3250.                         refresh = TRUE;
  3251.  
  3252.                         break;
  3253.  
  3254.                     case ACTION_REQFILE:
  3255.                     case ACTION_REQFILENAME:
  3256.                     case ACTION_REQFOLDER:
  3257.  
  3258.                         {
  3259.                             // choose default folder for file requester (NULL = last path)
  3260.  
  3261.                             UBYTE *folder = NULL;
  3262.  
  3263.                             #ifdef TARGET_VBCC
  3264.  
  3265.                             switch (info->Page)
  3266.                             {
  3267.                                 case PAGE_INDEX:
  3268.  
  3269.                                     if (target->GadgetID == GD_VCCCONFIG)
  3270.  
  3271.                                         folder = "vbcc:config";
  3272.  
  3273.                                     break;
  3274.                             }
  3275.  
  3276.                             #endif
  3277.  
  3278.                             name = RequestPath("Choose...", folder, "", connectivity->Action == ACTION_REQFOLDER, connectivity->Action == ACTION_REQFILENAME);
  3279.                         }
  3280.  
  3281.                         if (name == NULL)
  3282.  
  3283.                             break;
  3284.  
  3285.                         // fall through
  3286.  
  3287.                     case ACTION_POP:
  3288.  
  3289.                         // get name for new entry via pop-up button ?
  3290.  
  3291.                         if (connectivity->Action == ACTION_POP)
  3292.                         {
  3293.                             UBYTE **labels;
  3294.                             ULONG   active;
  3295.  
  3296.                             GetAttr(GTCY_Labels, gadget, (ULONG *)&labels);
  3297.                             GetAttr(GTCY_Active, gadget, (ULONG *)&active);
  3298.  
  3299.                             if (labels)
  3300.  
  3301.                                 name = labels[active];
  3302.                         }
  3303.  
  3304.                         // fall through
  3305.  
  3306.                     case ACTION_ADD:
  3307.                     case ACTION_DEL:
  3308.                     case ACTION_EDIT:
  3309.  
  3310.                         if (name)
  3311.                         {
  3312.                             if (targettype == LISTVIEW_KIND)
  3313.                             {
  3314.                                 struct Node *selected;
  3315.                                 struct List *list;
  3316.                                 ULONG        active;
  3317.                                 ULONG        labels;
  3318.                                 UWORD        ID;
  3319.  
  3320.                                 if (ExamineListview(info, target, &list, &selected, &active, &labels, &ID))
  3321.                                 {
  3322.                                     switch (connectivity->Action)
  3323.                                     {
  3324.                                         case ACTION_POP:
  3325.                                         case ACTION_ADD:
  3326.                                         case ACTION_REQFILE:
  3327.                                         case ACTION_REQFOLDER:
  3328.  
  3329.                                             {
  3330.                                                 struct Node *node;
  3331.  
  3332.                                                 if (node = (struct Node *)CreateNode(name))
  3333.                                                 {
  3334.                                                     GT_SetGadgetAttrs(target, window, NULL, GTLV_Labels, ~0, TAG_DONE);
  3335.  
  3336.                                                     if (selected)
  3337.                                                     {
  3338.                                                         Insert (list, node, selected);
  3339.  
  3340.                                                         ++active;
  3341.                                                     }
  3342.                                                     else
  3343.                                                     {
  3344.                                                         AddTail(list, node);
  3345.  
  3346.                                                         active = labels;
  3347.                                                     }
  3348.  
  3349.                                                     GT_SetGadgetAttrs(target, window, NULL, GTLV_Labels, list, GTLV_Selected, active, GTLV_Top, active, TAG_DONE);
  3350.  
  3351.                                                     refresh = TRUE;
  3352.                                                 }
  3353.                                             }
  3354.  
  3355.                                             break;
  3356.  
  3357.                                         case ACTION_DEL:
  3358.  
  3359.                                             if (selected)
  3360.                                             {
  3361.                                                 GT_SetGadgetAttrs(target, window, NULL, GTLV_Labels, ~0, TAG_DONE);
  3362.  
  3363.                                                 FreeNode(selected);
  3364.  
  3365.                                                 GT_SetGadgetAttrs(target, window, NULL, GTLV_Labels, list, TAG_DONE);
  3366.  
  3367.                                                 refresh = TRUE;
  3368.                                             }
  3369.  
  3370.                                             break;
  3371.  
  3372.                                         case ACTION_EDIT:
  3373.  
  3374.                                             if (selected)
  3375.                                             {
  3376.                                                 ULONG string = (ULONG)NULL;
  3377.  
  3378.                                                 GT_GetGadgetAttrs(gadget, window, NULL, GTST_String, &string, TAG_DONE);
  3379.  
  3380.                                                 if (string)
  3381.                                                 {
  3382.                                                     GT_SetGadgetAttrs(target, window, NULL, GTLV_Labels, ~0, TAG_DONE);
  3383.  
  3384.                                                     NameNode(selected, (UBYTE *)string);
  3385.  
  3386.                                                     GT_SetGadgetAttrs(target, window, NULL, GTLV_Labels, list, TAG_DONE);
  3387.                                                 }
  3388.                                             }
  3389.  
  3390.                                             break;
  3391.                                     }
  3392.                                 }
  3393.                             }
  3394.                             else if (targettype == STRING_KIND)
  3395.                             {
  3396.                                 GT_SetGadgetAttrs(target, window, NULL, GTST_String, name, TAG_DONE);
  3397.                             }
  3398.                             else
  3399.                                 Warn(Assert, (APTR)__LINE__);
  3400.                         }
  3401.  
  3402.                         break;
  3403.                 }
  3404.  
  3405.             }
  3406.             else
  3407.                 Warn(Assert, (APTR)__LINE__);
  3408.         }
  3409.     }
  3410.  
  3411.     if (refresh)
  3412.  
  3413.         RefreshGhosting(info);
  3414. }
  3415.  
  3416. /* ------------------------------ ExamineListview ------------------------------
  3417.  
  3418.  Get listview details (in <list>, <selected>, <active>, <labels> and <ID>).
  3419.  
  3420. */
  3421.  
  3422. BOOL
  3423. ExamineListview(struct WindowSupportInfo *info, struct Gadget *gadget, struct List **list, struct Node **selected, ULONG *active, ULONG *labels, UWORD *ID)
  3424. {
  3425.     struct Syntax *syntax;
  3426.  
  3427.     // find compiler option associated with listview
  3428.  
  3429.     for (syntax = Syntax; syntax->ID < OPTIONS_MAXIMUM; ++syntax)
  3430.     {
  3431.         if ((syntax->Page == info->Page) && (syntax->GadgetID == gadget->GadgetID))
  3432.         {
  3433.             *ID = syntax->ID;
  3434.  
  3435.             // get list and ordinal number of selected node
  3436.  
  3437.             GT_GetGadgetAttrs(gadget, info->Window, NULL, GTLV_Labels, list, GTLV_Selected, active, TAG_DONE);
  3438.  
  3439.             // count labels (and find selected node)
  3440.  
  3441.             if (*list)
  3442.             {
  3443.                 struct Node *node;
  3444.  
  3445.                 *labels   = 0;
  3446.                 *selected = NULL;
  3447.  
  3448.                 for (node = (*list)->lh_Head; node->ln_Succ; node = node->ln_Succ)
  3449.                 {
  3450.                     if ((*labels)++ == *active)
  3451.  
  3452.                         *selected = node;
  3453.                 }
  3454.  
  3455.                 return(TRUE);
  3456.             }
  3457.         }
  3458.     }
  3459.  
  3460.     Warn(Assert, (APTR)__LINE__);
  3461.  
  3462.     return(FALSE);
  3463. }
  3464.  
  3465. ///
  3466. /// "lists"
  3467.  
  3468. /* -------------------------------- CreateNode ---------------------------------
  3469.  
  3470.  Create node structure
  3471.  
  3472. */
  3473.  
  3474. struct Node *
  3475. CreateNode(UBYTE *name)
  3476. {
  3477.     struct Node *node;
  3478.  
  3479.     if (node = AllocVec(sizeof(struct Node), MEMF_ANY | MEMF_CLEAR))
  3480.     {
  3481.         if (NameNode(node, name) == FALSE)
  3482.         {
  3483.             FreeVec(node);
  3484.  
  3485.             node = NULL;
  3486.         }
  3487.     }
  3488.  
  3489.     return(node);
  3490. }
  3491.  
  3492. /* --------------------------------- NameNode -----------------------------------
  3493.  
  3494.  (Re-)name a node structure
  3495.  
  3496. */
  3497.  
  3498. BOOL
  3499. NameNode(struct Node *node, UBYTE *name)
  3500. {
  3501.     UBYTE *buffer;
  3502.  
  3503.     if (buffer = (UBYTE *)AllocVec(strlen(name) + 1, MEMF_ANY))
  3504.     {
  3505.         strcpy(buffer, name);
  3506.  
  3507.         if (node->ln_Name)
  3508.  
  3509.             FreeVec(node->ln_Name);
  3510.  
  3511.         node->ln_Name = buffer;
  3512.  
  3513.         return(TRUE);
  3514.     }
  3515.     else
  3516.         return(FALSE);
  3517. }
  3518.  
  3519. /* --------------------------------- FreeNodes ---------------------------------
  3520.  
  3521.  Free all nodes attached to <list>
  3522.  
  3523. */
  3524.  
  3525. void
  3526. FreeNodes(struct List *list)
  3527. {
  3528.     struct Node *node, *next;
  3529.  
  3530.     for (node = list->lh_Head; node && (next = node->ln_Succ); node = next)
  3531.     {
  3532.         FreeNode(node);
  3533.     }
  3534. }
  3535.  
  3536. /* --------------------------------- FreeNode ----------------------------------
  3537.  
  3538.  Unlink and free a node
  3539.  
  3540. */
  3541.  
  3542. void
  3543. FreeNode(struct Node *node)
  3544. {
  3545.     Remove(node);
  3546.  
  3547.     if (node->ln_Name)
  3548.  
  3549.         FreeVec(node->ln_Name);
  3550.  
  3551.     FreeVec(node);
  3552. }
  3553.  
  3554. /* --------------------------------- FreeDupes ---------------------------------
  3555.  
  3556.  Remove <nodes> from <list> that match <pattern>. This function will remove true
  3557.  matches and duplicates of the form "-option=*" (matching option name followed
  3558.  by variable argument).
  3559.  
  3560. */
  3561.  
  3562. void
  3563. FreeDupes(struct List *list, UBYTE *pattern)
  3564. {
  3565.     struct Node *node;
  3566.     struct Node *next;
  3567.     UBYTE       *fillin;
  3568.     UWORD        len;
  3569.  
  3570.     // option followed by argument or unqualified option ?
  3571.  
  3572.     if (fillin = strchr(pattern, '='))
  3573.         len = (fillin - pattern + 1);
  3574.     else
  3575.         len = strlen(pattern);
  3576.  
  3577.     for (node = list->lh_Head; next = node->ln_Succ; node = next)
  3578.     {
  3579.         if (node->ln_Name)
  3580.         {
  3581.             if (strlen(node->ln_Name) >= len)
  3582.             {
  3583.                 if (memcmp(node->ln_Name, pattern, len) == 0)
  3584.                 {
  3585.                     FreeNode(node);
  3586.                 }
  3587.             }
  3588.         }
  3589.         else
  3590.             FreeNode(node);
  3591.     }
  3592. }
  3593.  
  3594. ///
  3595. /// "asl"
  3596.  
  3597. /* ---------------------------------- RequestPath ------------------------------
  3598.  
  3599.  Request file or folder, return selected name (static string)
  3600.  
  3601. */
  3602.  
  3603. UBYTE *
  3604. RequestPath(UBYTE *title, UBYTE *path, UBYTE *file, BOOL foldersonly, BOOL filenameonly)
  3605. {
  3606.     static UBYTE lastpath[MAX_PATHLEN + 1];
  3607.  
  3608.     struct FileRequester *fileReq;
  3609.  
  3610.     if (path == NULL)
  3611.  
  3612.         path = lastpath;
  3613.  
  3614.     fileReq = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
  3615.  
  3616.         ASLFR_PubScreenName, Config.Pubscreen,
  3617.         ASLFR_TitleText,     title,
  3618.         ASLFR_InitialDrawer, path,
  3619.         ASLFR_InitialFile,   file,
  3620.         ASLFR_DrawersOnly,   foldersonly,
  3621.         ASLFR_DoMultiSelect, FALSE,
  3622.         ASLFR_DoSaveMode,    FALSE,
  3623.         ASLFR_RejectIcons,   TRUE,
  3624.  
  3625.         TAG_DONE
  3626.     );
  3627.  
  3628.     if (fileReq) {
  3629.  
  3630.         if (AslRequest(fileReq, NULL))
  3631.         {
  3632.             static UBYTE result[MAX_PATHLEN + 1];
  3633.  
  3634.             strncpy(lastpath, fileReq->fr_Drawer, MAX_PATHLEN);
  3635.  
  3636.             if (filenameonly)
  3637.             {
  3638.                 strncpy(result, fileReq->fr_File, MAX_PATHLEN);
  3639.             }
  3640.             else
  3641.             {
  3642.                 strncpy(result, fileReq->fr_Drawer, MAX_PATHLEN);
  3643.  
  3644.                 // make path absolute ?
  3645.  
  3646.                 if (strchr(fileReq->fr_Drawer, ':') == NULL)
  3647.                 {
  3648.                     BPTR lock;
  3649.  
  3650.                     if (lock = Lock(fileReq->fr_Drawer, ACCESS_READ))
  3651.                     {
  3652.                         NameFromLock(lock, result, MAX_PATHLEN);
  3653.  
  3654.                         UnLock(lock);
  3655.                     }
  3656.                 }
  3657.  
  3658.                 AddPart(result, fileReq->fr_File, MAX_PATHLEN);
  3659.             }
  3660.  
  3661.             FreeAslRequest(fileReq);
  3662.  
  3663.             return(result);
  3664.         }
  3665.     }
  3666.  
  3667.     return(NULL);
  3668. }
  3669.  
  3670. ///
  3671. /// "misc"
  3672.  
  3673. /* ---------------------------------- Tackon -----------------------------------
  3674.  
  3675.  Append <file> to <path> and return static result
  3676.  
  3677. */
  3678.  
  3679. UBYTE *
  3680. Tackon(UBYTE *path, UBYTE *file)
  3681. {
  3682.     static UBYTE buffer[MAX_PATHLEN + 1];
  3683.  
  3684.     strcpy(buffer, path);
  3685.  
  3686.     if (AddPart(buffer, file, sizeof(buffer)))
  3687.     {
  3688.         return(buffer);
  3689.     }
  3690.     else
  3691.         return(NULL);
  3692. }
  3693.  
  3694. ///
  3695.